Синхронізація та багато репозиторіїв

Бандли та архіви

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

Бандл Архів
Містить Історію: коміти, гілки, теги Файли на одному коміті
Відкривається через 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 або tarball. Ні .git, ні історії, ні можливості звідти фетчити — і саме в цьому суть, коли одержувач має отримати вихідний код, а не репозиторій.

Опція Що вона робить
Посилання Гілка, тег або коміт для експорту. Тег — зазвичай правильна відповідь
Формат zip, tar.gz або tar
Загорнути в теку Додає теку верхнього рівня, щоб розпакування не розсипало файли скрізь
Лише цей шлях Експортувати одну піддиректорію замість усього дерева

export-ignore — ось заради чого цим варто користуватися

Репозиторій може позначити шляхи в .gitattributes:

.github/     export-ignore
test/        export-ignore
*.psd        export-ignore

Ці шляхи не потрапляють у жоден архів, лишаючись при цьому в репозиторії. Саме так проєкт випускає релізний tarball без конфігурації CI, без тестових фікстур і без своїх 200 МБ дизайнерських файлів — причому правило живе в репозиторії, а не в чиємусь релізному скрипті.

Обмеження, про які варто знати

  • Бандл — це повна копія, якщо ви не використали діапазон. Пакування репозиторію на 2 ГБ дає файл на 2 ГБ і триває стільки ж, скільки клонування.
  • Порожні бандли відхиляє git, а не Gitcito: діапазон, між кінцями якого нічого немає, дає помилку, а не марний файл.
  • Імпорт не зливає. Посилання приходять під bundle/… і лишаються там, доки ви щось із ними не зробите.
  • Архів не має історії, тож перетворити його назад на репозиторій неможливо. Якщо одержувачу доведеться комітити — надсилайте бандл.
  • export-ignore впливає лише на архіви. Він нічого не приховує ні від клонування, ні від бандла, ні від історії — для цього дивіться видалення файлу з історії.

Дивіться також: Синхронізація · Безпечний обмін · Видалення файлу з історії

Покращити цей переклад на GitHub