Гілки та хірургія

Сабтрі

Сабтрі копіює інший репозиторій у теку вашого. Після цього файли справді там: звичайний git clone їх отримує, git checkout рухає їх, як будь-який інший файл, і нікому не треба знати, що тека прийшла звідкись іще.

У цьому й уся різниця з сабмодулем, який зберігає лише вказівник і потребує --recurse-submodules, власного чекауту та власного відокремленого HEAD, щоб у ньому не заплутатися.

⌘K → Сабтрі.

Вендорена тека, знайдена в історії, з джерелом, яке Gitcito для неї пам’ятає

Пастка, про яку ніхто не згадує

Git не веде для сабтрі жодного маніфесту. У сабмодуля є .gitmodules, де перелічено кожен url і шлях. У сабтрі немає нічого — тільки трейлер git-subtree-dir: на коміті, який зробив імпорт.

Тож репозиторій може містити сабтрі й не дати вам жодного способу дізнатися, звідки воно взялося. Gitcito робить, що може:

  • Список виявляється з історії, читанням тих самих трейлерів. Будь-яке сабтрі, додане ким завгодно й будь-яким інструментом, у ньому з’явиться.
  • Репозиторій-джерело та реф Gitcito запам’ятовує в git-конфізі цього репозиторію. Сабтрі, виявлене з історії, починає з порожніми полями — заповніть їх один раз, і пул та пуш працюватимуть надалі.

Запам’ятовані значення живуть під gitcito.subtree.* у .git/config, тож вони лишаються з репозиторієм, але не подорожують у клон. Забути очищає їх і більше нічого не зачіпає.

Як додати

Поле Що означає
Тека Куди воно потрапить, напр. vendor/parser. Ще не повинна існувати
Репозиторій-джерело URL або шлях на диску
Гілка або тег Що імпортувати
Сквош Внести як один коміт замість усієї його історії

Лишіть Сквош увімкненим, якщо у вас немає причини вчинити інакше. Без нього кожен коміт бібліотеки назавжди вплітається у ваш лог, і git log перестає бути про ваш проєкт.

Життя з ним

Дія Що вона запускає
Пул git subtree pull — зміни з upstream приходять як злиття у вашу теку
Пуш git subtree push — ваші локальні зміни під тією текою повертаються до джерела
Split git subtree split -b <branch> — витягує власну історію теки в гілку, де файли лежать у корені

Split — це те, про що варто знати: він перетворює вендоровану теку назад на історію самостійного репозиторію, і саме так сабтрі перестає бути сабтрі.

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

  • Пуш повільний. Він щоразу перераховує історію теки з нуля. На великому репозиторії це секунди чи хвилини, а не миттєво, і Gitcito може тільки чекати на нього.
  • Пул — це злиття, тож він може конфліктувати, як будь-яке злиття, — і ви опиняєтеся в розв’язувачі.
  • git subtree — це contrib-скрипт, а не вбудована команда git. У врізаній інсталяції git його може не виявитися; Gitcito каже про це прямо, замість переказувати «'subtree' is not a git command».
  • Історію, схлопнуту сквошем, не можна розхлопнути пізніше. Ті коміти ніколи не імпортувалися.
  • Gitcito не перетворює сабмодуль на сабтрі й навпаки.

Дивіться також: Злиття та ребейз · Сантехніка з інтерфейсом

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