Каковы концептуальные различия между использованием подмодуля git и поддерева?
Каковы типичные сценарии для каждого?
Каковы концептуальные различия между использованием подмодуля git и поддерева?
Каковы типичные сценарии для каждого?
Ответы:
Что если я хочу, чтобы ссылки всегда указывали на ГОЛОВКУ внешнего репо?
Вы можете сделать субмодуль, чтобы следовать заголовку ветви субмодуля удаленного репо, с помощью:
о git submodule add -b <branch> <repository> [<path>]
. (указать ветвь, которой нужно следовать)
o, git submodule update --remote
которая <repository>/<branch>
по умолчанию обновит содержимое подмодуля до последней HEAD from origin/master
. Ваш основной проект все равно будет отслеживать хэши HEAD подмодуля, даже если --remote
он используется.
add -b
и --remote
после них в командах обновления, как указано в документации по обновлению подмодуля . В таком случае, -b
действительно ли все еще требуется следовать за HEAD мастера?
-b
используется для генерации правильных метаданных .gitmodule для подмодуля (это эквивалентно a git config -f .gitmodules submodule.<path>.branch <branch>
).
--remote
- --remote
работает также, если -b
не использовался add
. В обоих случаях обновление вызовет фиксацию в родительском репо с субмодулем, поэтому ссылки не всегда "всегда указывают на ГОЛОВУ" очень автоматическим способом ... либо я не получил его, либо это утверждение лучше убрать из оригинального ответа (?)
Концептуальная разница заключается в следующем:
С подмодулями git вы обычно хотите разделить большой репозиторий на более мелкие. Способ ссылки на подмодуль - maven-style - вы ссылаетесь на один коммит из другого (подмодуля) репозитория. Если вам нужно изменить внутри подмодуля, вы должны сделать коммит / push внутри подмодуля, затем сослаться на новый коммит в главном репозитории, а затем зафиксировать / протолкнуть измененную ссылку основного репозитория. Таким образом, вы должны иметь доступ к обоим репозиториям для полной сборки.
С git subtree вы интегрируете другой репозиторий в свой, включая его историю. Таким образом, после его интеграции размер вашего репозитория, вероятно, будет больше (поэтому не стоит уменьшать размер репозитория). После интеграции нет соединения с другим хранилищем, и вам не нужен доступ к нему, если вы не хотите получать обновление. Так что эта стратегия больше для повторного использования кода и истории - я лично не использую ее.
git subtree
вами все еще можно подтолкнуть - если вы хотели - правильно?
субмодуль,
отправляющий основной репозиторий на удаленный компьютер, не передает файлы субмодуля
поддерево,
выдвигающее основной репо на удаленный сайт, подталкивает файлы поддерева
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master