Бандлы и архивы
Два способа уложить репозиторий в один файл. Выглядят они взаимозаменяемыми, а таковыми не являются — и вся эта страница существует ровно потому, что выбрать не тот легко.
| Бандл | Архив | |
|---|---|---|
| Содержит | Историю: коммиты, ветки, теги | Файлы на одном коммите |
| Открывается | git clone / git fetch — он и есть удалённый репозиторий |
Любым распаковщиком |
| Дальше | Из него можно фетчить снова, сливать, продолжать работу | Ничего. Это снимок |
| Нужен для | Переноса работы на машину без сети | «Пришли мне исходники на v2.1» |
⌘K → Собрать бандл репозитория или Экспортировать архив.

Бандлы
Бандл — это ответ git на разрыв, который не перекрывает ни одна сеть: машина в
изолированном контуре, USB-флешка, вложение в письме, ноутбук в самолёте. На
принимающей стороне запускают git clone work.bundle myrepo и получают
настоящий репозиторий, с вашей историей и вашими ветками, который фетчит из
этого файла так, будто это сервер.
Три области охвата:
| Охват | Что уезжает | Размер |
|---|---|---|
| Всё | Каждая ветка и тег, полная история | Весь репозиторий |
| Одна ветка или тег | Эта ссылка и всё, до чего она дотягивается | Обычно бо́льшая часть |
| Диапазон коммитов | Только то, что между двумя концами | Небольшой |
Бандл диапазона — это патч истории, а не репозиторий. Он записывает дальний конец как предварительное условие: git откажется открывать его в репозитории, где этого коммита ещё нет, потому что новым коммитам будет не к чему прикрепиться. Это правильное поведение и неожиданность в первый раз. Берите диапазон, когда у другой стороны уже есть ваша работа до какой-то точки — тега, который они получили последним, или коммита, от которого вы оба ответвились.
Как принять бандл
Импортировать бандл… читает файл, показывает, что в нём лежит, и сразу говорит, годится ли он для этого репозитория: если предварительных условий не хватает, вам скажут, скольких именно, а не уронят операцию позже формулировками самого git.
Импортированные ссылки оказываются под bundle/…, в пространстве имён
отслеживания удалённых веток. Ничего локального не двигается: ни одна ветка не
перематывается вперёд, ничья работа не перезаписывается. Дальше вы сливаете,
ребейзите или переключаетесь на bundle/main на своих условиях — ровно так же,
как с веткой из любого другого удалённого репозитория.
Чтобы начать из бандла новый репозиторий, клонируйте из файла в терминале:
git clone work.bundle myrepo. Gitcito импортирует в уже открытый репозиторий;
клонировать из файла он не умеет.
Архивы
git archive пишет дерево на одном коммите в виде zip или тарбола. Ни .git,
ни истории, ни возможности из него фетчить — и это ровно то, что нужно, когда
получателю должны достаться исходники, а не репозиторий.
| Опция | Что делает |
|---|---|
| Ссылка | Ветка, тег или коммит для экспорта. Обычный ответ — тег |
| Формат | zip, tar.gz или tar |
| Обернуть в каталог | Добавляет папку верхнего уровня, чтобы распаковка не разбрасывала файлы куда попало |
| Только этот путь | Экспортировать один подкаталог вместо всего дерева |
export-ignore — ради этого всё и затевалось
Репозиторий может пометить пути в .gitattributes:
.github/ export-ignore
test/ export-ignore
*.psd export-ignore
Эти пути не попадают ни в один архив, оставаясь при этом в репозитории. Именно так проект выпускает релизный тарбол без своей конфигурации CI, без фикстур и без 200 МБ дизайнерских исходников — причём правило живёт в репозитории, а не в чьём-то релизном скрипте.
Ограничения, о которых стоит знать
- Бандл — это полная копия, если вы не задали диапазон. Бандл репозитория на 2 ГБ пишет файл на 2 ГБ и занимает столько же времени, сколько клонирование.
- Пустые бандлы отвергает git, а не Gitcito: диапазон, между концами которого ничего нет, даёт ошибку, а не бесполезный файл.
- Импорт не сливает. Ссылки приезжают под
bundle/…и остаются там, пока вы что-нибудь с ними не сделаете. - У архива нет истории, поэтому обратно в репозиторий его не превратить. Если получателю понадобится коммитить, отправляйте бандл.
export-ignoreвлияет только на архивы. Он ничего не прячет ни от клонирования, ни от бандла, ни от истории — для этого см. удаление файла из истории.
См. также: Синхронизация · Безопасный обмен · Удаление файла из истории