Вкладені сховища Git?


181

Чи можна вкладати сховища Git? У мене є:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

Чи має сенс , щоб полегшити управління всім локально або потрібно управляти , і третя сторона одна окремо?git init/add/project_rootmy_project

Відповіді:


159

Можливо, ви шукаєте функцію Git, що називається субмодулями . Ця функція допомагає керувати залежними сховищами, які вкладені всередині вашого основного сховища.


43
Як відносний початківець git, я знайшов цей блог / підручник простішим для розуміння chrisjean.com/2009/04/20/…. Він потребує більш простого підходу, орієнтуючись на просто git, а не на контекст сценарію оболонки помічника; Мені було легше читати.
Джон К

4
Блог chrisjean.com, здається, не є актуальним, базуючись лише на тому, щоб спробувати наслідувати його. Публікація у Вікі від Грега може бути дещо складнішою, але я, як новачок, я віддаю перевагу точним та простим ...
мудрець

Блог, здається, працює нормально, і, на жаль, для мудреця, 34 (зараз 35) голосів за коментар, схоже, згодні з тим, що в статті блогу є цінність. Виявляється, вам не потрібно жертвувати точністю для ясності та конкретних порад. Прочитавши це, я думаю, що автор уже трохи дослідив та, ймовірно, прочитав фактичну документацію на Git , а не лише сторінку вікі kernel.org. Роз'яснення автора Git, орієнтованого на Git, на повністю контекстуалізований приклад, здається, дуже корисне для великої кількості людей ...
Меттью Вебер

13
До речі, згадувана вище християнська посилання мертва. Оновлене посилання chrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh

35

Розмістіть сторонні бібліотеки в окремому сховищі та використовуйте підмодулі, щоб пов’язати їх з основним проектом. Ось посібник:

http://git-scm.com/book/en/Git-Tools-Submodules

Вирішуючи, як сегментувати репо, я зазвичай вирішував, виходячи з того, як часто я їх змінюватиму. Якщо це стороння бібліотека і лише зміни, які ви вносите до неї, - це оновлення до нової версії, тоді вам обов'язково слід відокремити її від основного проекту.


22

Просто для повноти:

Я б порекомендував ще одне рішення: злиття піддірядок .

На відміну від субмодулів, простіше утримувати. Ви створили б кожен сховище звичайним чином. Перебуваючи у вашому головному сховищі, ви хочете об'єднати головний (або будь-яку іншу гілку) іншого сховища у каталог вашого головного каталогу.

$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`

Потім, щоб перетягнути інший сховище у свій каталог (оновити його), використовуйте стратегію злиття піддерева:

$ git pull -s subtree OtherRepository master

Я зараз використовую цей метод, він працює :-)

Більш детально про цей спосіб, включаючи порівняння його з підмодулями, можна знайти в цьому документі довідки git .


Посилання на підтере злиття в книзі git більше не працює. Наразі, посилається, що це посилання: git-scm.com/book/en/v2/…
ericx

18

Ви можете додати

/project_root/third_party_git_repository_used_by_my_project

до

/project_root/.gitignore

це повинно запобігти включенню вкладеного репо до батьківського репо, і ви можете працювати з ними самостійно.

Але: Якщо користувач запускає git clean -dfx у батьківському репо, він видалить ігнороване вкладене репо. Інший спосіб - позначити папку та проігнорувати посилання. Якщо потім запустити git clean, символьне посилання буде видалено, але "вкладене" репо залишиться недоторканим, оскільки воно дійсно знаходиться в іншому місці.



5

Підсумок

Чи можна вкладати сховища git?

Так. Однак git за замовчуванням не відстежує .gitпапку вкладеного сховища. Git має функції, призначені для управління вкладеними сховищами (читати далі).

Чи має сенс git init / add / project_root, щоб полегшити управління всім локально або мені потрібно керувати my_project та третьою стороною окремо?

Це, мабуть, не має сенсу, оскільки git має функції для управління вкладеними сховищами. Git побудований в особливості для управління вкладеними репозитарій submoduleі subtree.

Ось блог на цю тему, і ось ТАК, що висвітлює плюси та мінуси використання кожного.


2

Я б використовував одне сховище на проект. Таким чином історію стає легше переглядати.

Я також перевірив би версію сторонньої бібліотеки, яку я використовую, у сховище проекту, що використовує її.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.