Различия между подмодулем git и поддеревом

Каковы концептуальные различия между использованием подмодуля git и поддерева?

Каковы типичные сценарии для каждого?

6 ответов

Решение

Что если я хочу, чтобы ссылки всегда указывали на ГОЛОВКУ внешнего репо?

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

о git submodule add -b <branch> <repository> [<path>], (указать ветку для подражания)
о git submodule update --remote который обновит содержимое субмодуля до последней HEAD из <repository>/<branch>, по умолчанию origin/master, Ваш основной проект все равно будет отслеживать хэши HEAD субмодуля, даже если --remote хотя используется.


Субмодуль является ссылкой;

поддерево является копией

Концептуальная разница заключается в следующем:

С подмодулями git вы обычно хотите разделить большой репозиторий на более мелкие. Способ ссылки на подмодуль - стиль maven - вы ссылаетесь на один коммит из другого (подмодуля) хранилища. Если вам нужно изменить внутри подмодуля, вы должны сделать коммит / push внутри подмодуля, затем сослаться на новый коммит в главном репозитории, а затем зафиксировать / протолкнуть измененную ссылку основного репозитория. Таким образом, вы должны иметь доступ к обоим репозиториям для полной сборки.

С git subtree вы интегрируете другой репозиторий в свой, включая его историю. Таким образом, после его интеграции размер вашего репозитория, вероятно, будет больше (поэтому не стоит уменьшать размер репозитория). После интеграции нет соединения с другим хранилищем, и вам не нужен доступ к нему, если вы не хотите получать обновление. Так что эта стратегия больше для повторного использования кода и истории - я лично не использую ее.

подмодуль
передача основного репозитория на удаленный компьютер не передает файлы субмодуля

поддерево
подталкивание основного репо к удаленным файлам подталкивает поддерево

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

[Подмодуль Git — Atlassian]

Субмодуль Git полезен, если вы хотите хранить историю коммитов встроенного репозитория отдельно от основного репозитория. Однако использование подмодулей может быть сложным и трудным в управлении, особенно когда вам необходимо обновить встроенный репозиторий.

[Git Subtree и сравнение с подмодулем — Atlassian]

Поддерево Git — это решение, позволяющее объединять один репозиторий с другим в качестве подкаталога, но сохраняя при этом всю историю коммитов. Это полезно, когда вы хотите поделиться набором файлов между разными проектами без необходимости поддерживать отдельный репозиторий. Использование поддерева проще, чем использование подмодуля, и, как правило, им легче управлять.

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


Получить/обновить сравнение рабочих процессов

Сравним команды отправки и получения обновлений:

1. Субмодуль

      #push updates:
cd path/to/submodule
1. git add .
2. git commit -m "Submodule Update"
3. git push origin master
cd ..
4. git add submodule
5. git commit -m "Submodule ref update"
6. git push origin master
# >Needs to be in this order! Easy to get trouble<

#pull:
git submodule update --remote

2. Поддерево

      #push updates:
cd path/to/shared/repo
1. git add .
2. git commit -m "Subtree update"
3. git push origin master
#then
4. git subtree push --prefix=path/to/shared/repo shared-repo master

#pull:
git subtree pull --prefix=path/to/shared/repo shared-repo master
Другие вопросы по тегам