Ответ 1
Возможно, вы ищете функцию 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 и сторонней стороной отдельно?
Возможно, вы ищете функцию Git под названием подмодули. Эта функция позволяет вам управлять зависимыми репозиториями, вложенными в основной репозиторий.
Поместите свои сторонние библиотеки в отдельный репозиторий и используйте подмодули, чтобы связать их с основным проектом. Вот прохождение:
http://git-scm.com/book/en/Git-Tools-Submodules
Решая, как сегментировать репо, я обычно решаю на основе того, как часто я буду изменять их. Если это сторонняя библиотека, и только изменения, которые вы делаете для нее, это обновление до более новой версии, тогда вы обязательно должны отделить ее от основного проекта.
Только для полноты:
Есть другое решение, я бы рекомендовал: сложение поддерева.
В отличие от подмодулей, его легче поддерживать. Вы бы создали каждый репозиторий обычным способом. В основном хранилище вы хотите объединить мастер (или любую другую ветку) другого репозитория в каталог вашего основного каталога.
$ 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.
git-subtree поможет вам работать с несколькими проектами в одном дереве и сохранять для них разделяемую историю.
Вы можете добавить
/project_root/third_party_git_repository_used_by_my_project
to
/project_root/.gitignore
что должно препятствовать включению вложенного репо в родительское репо, и вы можете работать с ними независимо.
Но: Если пользователь выполняет git clean -dfx в родительском репо, он удалит игнорируемое вложенное репо. Другой способ - символизировать ссылку и игнорировать символическую ссылку. Если вы затем запустите git clean, символическая ссылка будет удалена, но "вложенное" репо останется неповрежденным, поскольку оно действительно находится в другом месте.
Я бы использовал один репозиторий для каждого проекта. Таким образом, история становится легче просматривать.
Я также проверил бы версию библиотеки сторонних разработчиков, которую я использую, в репозиторий проекта, используя его.
Резюме.
Могу ли я вложить git репозитории?
Да. Однако по умолчанию git не отслеживает вложенный репозиторий. Git имеет функции, предназначенные для управления вложенными репозиториями (читайте дальше).
Имеет ли смысл git init/add/project_root, чтобы упростить управление всем локально, или мне нужно управлять my_project и третьей стороной отдельно?
Это, вероятно, не имеет смысла, так как git имеет функции для управления вложенными репозиториями. Встроенные функции Git для управления вложенными репозиториями являются submodule
и subtree
.
@martin-owen написал блог на эту тему, и есть такой вопрос, в котором освещаются плюсы и минусы использования каждого из них.