Тур по Git
Продвинутый Git / Урок 5.14

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 для исключения файлов из архивов