git archive — Создание релизных архивов
git archive создаёт сжатый архив (tar или zip) файлов вашего репозитория без директории .git. Это чистый способ упаковать релиз или поделиться кодом в виде снимка.
Почему не просто заархивировать директорию?
Если вы заархивируете папку проекта, вы включите:
- Всю директорию
.git(всю историю, все объекты) - Неотслеживаемые файлы, артефакты сборки, локальные конфигурации
- Файлы из
.gitignore, которые не должны распространяться
git archive экспортирует только отслеживаемые файлы на конкретный момент времени — чисто, минимально и воспроизводимо.
Базовое использование
# Создать tar.gz-архив текущего HEAD
git archive --format=tar.gz --prefix=project/ HEAD > project.tar.gz
# Создать zip-архив
git archive --format=zip --prefix=project/ HEAD > project.zip
Флаг --prefix=project/ добавляет директорию верхнего уровня, чтобы при распаковке архива создавалась папка project/, а не файлы высыпались в текущую директорию.
Архивирование конкретного тега или ветки
# Архивировать тег релиза
git archive --format=tar.gz --prefix=myapp-v1.0/ v1.0.0 > myapp-v1.0.tar.gz
# Архивировать конкретную ветку
git archive --format=tar.gz --prefix=myapp-dev/ develop > myapp-dev.tar.gz
Экспорт конкретных директорий
Вы можете заархивировать только часть репозитория:
# Архивировать только директорию src
git archive --format=tar.gz HEAD -- src/ > src-only.tar.gz
# Архивировать конкретные файлы
git archive --format=zip HEAD -- README.md LICENSE docs/ > docs.zip
Использование .gitattributes для экспорта
Вы можете пометить файлы для исключения из архивов с помощью .gitattributes:
# .gitattributes
tests/ export-ignore
.github/ export-ignore
.gitignore export-ignore
Makefile export-ignore
Файлы, помеченные export-ignore, не появятся в выводе git archive. Это полезно для исключения тестов, конфигураций CI и файлов разработки из релизных архивов.
Сценарии использования
- Релизные артефакты — создание тарболлов для каждого тега версии в CI/CD
- Обмен кодом — отправка снимка кому-то без доступа к Git
- Развёртывание — деплой чистого архива без накладных расходов
.git - Соответствие требованиям — распространение исходного кода без истории разработки
Типичные шаблоны в CI/CD
# В CI-пайплайне: создать релизный архив из тега
TAG=$(git describe --tags --abbrev=0)
git archive --format=tar.gz --prefix="${TAG}/" "${TAG}" > "${TAG}.tar.gz"
Ключевые моменты
git archiveэкспортирует отслеживаемые файлы без директории.git- Используйте
--prefix=name/для обёртки файлов в директорию верхнего уровня - Архивируйте любой тег, ветку или коммит для воспроизводимых снимков
- Используйте
export-ignoreв.gitattributesдля исключения файлов из архивов