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

Пастка, про яку ніхто не згадує
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 не перетворює сабмодуль на сабтрі й навпаки.
Дивіться також: Злиття та ребейз · Сантехніка з інтерфейсом