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

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

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

Ответ 1

Что, если я хочу, чтобы ссылки всегда указывали на HEAD внешнего репо?

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

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


Ответ 2

подмодуль - ссылка;

поддерево копируется

Ответ 3

Концептуальная разница:

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

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

Ответ 4

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

суб-дерево
нажатие основного репо на удаленные файлы подтабливает файлы