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

300

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

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

Натан Х
источник
3
Это может не ответить на все ваши вопросы, но интересно читать по теме: blogs.atlassian.com/2013/05/…
Чоп
Аналогичный вопрос - stackoverflow.com/questions/571232/…
Майкл Фрейдгейм
"Альтернативы Git подмодулях?": Stackoverflow.com/questions/6500524/...
brillout

Ответы:

177

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

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

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


VonC
источник
кажется, ваш ответ идет вразрез с ответом, за который проголосовали: stackoverflow.com/questions/10443627/…
Натан Х
@NathanH это (возможность отслеживать HEAD) было добавлено годом позже (март 2013, git 1.8.2: github.com/git/git/blob/… )
VonC
Я вижу, что последующее поведение субмодуля также упоминается в вашем другом ответе . В этом случае я думаю, что вы хотите сказать, что всегда указание на HEAD подмодуля выполняется с помощью обеих команд add -bи --remoteпосле них в командах обновления, как указано в документации по обновлению подмодуля . В таком случае, -bдействительно ли все еще требуется следовать за HEAD мастера?
matanster
@matt -bиспользуется для генерации правильных метаданных .gitmodule для подмодуля (это эквивалентно a git config -f .gitmodules submodule.<path>.branch <branch>).
VonC
Тогда это не имеет ничего общего с включением --remote- --remoteработает также, если -bне использовался add. В обоих случаях обновление вызовет фиксацию в родительском репо с субмодулем, поэтому ссылки не всегда "всегда указывают на ГОЛОВУ" очень автоматическим способом ... либо я не получил его, либо это утверждение лучше убрать из оригинального ответа (?)
matanster
351

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

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

Feng
источник
121

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

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

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

Никлас П
источник
Но с git subtreeвами все еще можно подтолкнуть - если вы хотели - правильно?
Ixx
@lxx Если вы знаете URL хранилища ...
Франклин Ю
@FranklinYu Почему он этого не знает? не могу получить эту информацию из локальных метаданных git?
adi518
@ adi518 Да, если вы тот, кто создал поддерево. Однако, если вы отправили свой репозиторий в GitHub, а другие клонировали его, я не думаю, что он / она автоматически знает URL поддерева.
Франклин Ю
@NiklasP - не могли бы вы рассказать о «ссылке на новый коммит в главном репозитории»? Это один шаг, который я не знаю, как выполнить, и поэтому «измененная ссылка» - это тоже не то, что я понимаю.
Роберт Ошлер
21

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

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

Maciek Rek
источник
3
«Передача основного репо на удаленный сервер подталкивает файлы поддерева» Нет, это не так.
J Bramble
@JBramble Я должен упомянуть, что это сделано с приложением SourceTree, например:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek Rek