Синхронизация и много репозиториев

Бандлы и архивы

Два способа уложить репозиторий в один файл. Выглядят они взаимозаменяемыми, а таковыми не являются — и вся эта страница существует ровно потому, что выбрать не тот легко.

Бандл Архив
Содержит Историю: коммиты, ветки, теги Файлы на одном коммите
Открывается 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 влияет только на архивы. Он ничего не прячет ни от клонирования, ни от бандла, ни от истории — для этого см. удаление файла из истории.

См. также: Синхронизация · Безопасный обмен · Удаление файла из истории

Улучшить этот перевод на GitHub