Вложенные репозитории git?

Могу ли я вложить репозитории git? У меня есть:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

Имеет ли смысл git init/add/project_root облегчить управление всем локально или мне нужно управлять my_project и сторонней стороной отдельно?

Ответ 1

Возможно, вы ищете функцию Git под названием подмодули. Эта функция позволяет вам управлять зависимыми репозиториями, вложенными в основной репозиторий.

Ответ 2

Поместите свои сторонние библиотеки в отдельный репозиторий и используйте подмодули, чтобы связать их с основным проектом. Вот прохождение:

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

Решая, как сегментировать репо, я обычно решаю на основе того, как часто я буду изменять их. Если это сторонняя библиотека, и только изменения, которые вы делаете для нее, это обновление до более новой версии, тогда вы обязательно должны отделить ее от основного проекта.

Ответ 3

Только для полноты:

Есть другое решение, я бы рекомендовал: сложение поддерева.

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

$ 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 howto doc.

Ответ 4

git-subtree поможет вам работать с несколькими проектами в одном дереве и сохранять для них разделяемую историю.

Ответ 5

Вы можете добавить

/project_root/third_party_git_repository_used_by_my_project

to

/project_root/.gitignore

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

Но: Если пользователь выполняет git clean -dfx в родительском репо, он удалит игнорируемое вложенное репо. Другой способ - символизировать ссылку и игнорировать символическую ссылку. Если вы затем запустите git clean, символическая ссылка будет удалена, но "вложенное" репо останется неповрежденным, поскольку оно действительно находится в другом месте.

Ответ 6

Я бы использовал один репозиторий для каждого проекта. Таким образом, история становится легче просматривать.

Я также проверил бы версию библиотеки сторонних разработчиков, которую я использую, в репозиторий проекта, используя его.

Ответ 7

Резюме.

Могу ли я вложить git репозитории?

Да. Однако по умолчанию git не отслеживает вложенный репозиторий. Git имеет функции, предназначенные для управления вложенными репозиториями (читайте дальше).

Имеет ли смысл git init/add/project_root, чтобы упростить управление всем локально, или мне нужно управлять my_project и третьей стороной отдельно?

Это, вероятно, не имеет смысла, так как git имеет функции для управления вложенными репозиториями. Встроенные функции Git для управления вложенными репозиториями являются submodule и subtree.

@martin-owen написал блог на эту тему, и есть такой вопрос, в котором освещаются плюсы и минусы использования каждого из них.