2015-08-02 7 views
185

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

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

+2

Это может не отвечать на все ваши вопросы, но интересно читать по теме: http://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-g it-subtree/ – Chop

+0

Аналогичный вопрос: http://stackoverflow.com/questions/571232/svnexternals-equivalent-in-git/18088319#18088319 –

ответ

103
  • подмодуль лучше подходит для component-based development, где ваш главный проект зависит от фиксированной версии другого компонента (репо).
    Вы держите только ссылки в вашем родительском репо (gitlinks, special entries in the index)

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

Вы можете сделать подмодуль следовать руководитель филиала подмодуль удаленный репозиторий, с:

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


+0

, ваш ответ, похоже, идет против голосованного ответа здесь: http://stackoverflow.com/questions/10443627/force-git-submodule-to-always-stay-current –

+0

Но, может быть, его ответ, если устарел ... –

+0

@NathanH это (возможность отслеживать HEAD) было добавлено через год (март 2013 года, git 1.8.2: https://github.com/git/git/blob/efc8a625e9b03e6f8ceed37ccd4b9167a7447e31 /Documentation/RelNotes/1.8.2.txt#L186-L188) – VonC

84

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

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

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

+0

Но с 'git subtree' вы все равно можете нажать - если хотите - правильно? – Ixx

+0

@lxx Если вы знаете URL-адрес репозитория ... –

176

Подмодуль - это ссылка;

поддерево скопировать

+16

@WiSaGaN Он * делает * дает ответ. Пожалуйста, обратите больше внимания при рассмотрении. – Rob

+12

@Rob Учитывая, что OP знает о различии между подмодулем и поддеревом и спрашивает, что такое концептуальная разница, и каковы типичные сценарии. Маловероятно, что этот «ответ» полезен для него/нее. Это также однострочный вкладыш, который лучше подходит для комментариев. – WiSaGaN

+8

@WiSaGaN Это делает его ответом низкого качества, а не кандидатом на удаление. Пожалуйста [прочтите это] (http://meta.stackoverflow.com/questions/287563/youre-doing-it-wrong-a-plea-for-sanity-in-the-low-quality-posts-queue) для более Детали. – Rob

15

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

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

+0

"нажатие основного репо на удаленный файл подталкивает файлы поддерева" Нет, это не так. –

+0

@JBramble Я должен, вероятно, упомянуть, что это сделано с помощью приложения SourceTree, например: 'git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree push -v --tags production refs/heads/мастер: ссылки/головки/master' –