Каковы концептуальные различия между использованием подмодуля git и поддерева?
Каковы типичные сценарии для каждого?
git
git-submodules
git-subtree
Натан Х
источник
источник
Ответы:
Вы сохраняете только ссылки в своем родительском репо ( gitlinks , специальные записи в индексе )
Вы можете сделать субмодуль, чтобы следовать заголовку ветви субмодуля удаленного репо, с помощью:
о
git submodule add -b <branch> <repository> [<path>]
. (указать ветвь, которой нужно следовать)o,
git submodule update --remote
которая<repository>/<branch>
по умолчанию обновит содержимое подмодуля до последней HEAD fromorigin/master
. Ваш основной проект все равно будет отслеживать хэши HEAD подмодуля, даже если--remote
он используется.Смотрите пример в этом ответе .
источник
add -b
и--remote
после них в командах обновления, как указано в документации по обновлению подмодуля . В таком случае,-b
действительно ли все еще требуется следовать за HEAD мастера?-b
используется для генерации правильных метаданных .gitmodule для подмодуля (это эквивалентно agit 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