В файле .gitmodule
указывается URL-адрес репозитория модуля. Как git submodule
знать, какую версию скачать? Кажется, что он всегда проверяет последнюю версию. Затем, как разработчики обеспечивают совместимость между основным проектом и дополнительными модулями?
Как работает подмодуль git
Ответ 1
Ваш подмодуль представлен как специальная запись со специальным режимом (называемая gitlink, см. "Вложенные репозитории git без подмодулей?" ):
(См. "Checkout last git компиляция подмодуля")
new file mode 160000
index 0000000..4c4c5a2
Таким образом, он не проверяет версию "ПОСЛЕДНИЕ", но всегда конкретный SHA1, и он делает это в режиме DETACHED HEAD
(см. Как сделать подмодуль с отсоединенным HEAD
прикрепленным к фактическому HEAD
?".
Это не значит, что вы не можете обновить подмодуль, как я объясняю в истинном характере подмодулей.
Подробнее о подмодулях и потенциально о том, почему вы, возможно, не захотите их использовать (!), прочитайте отрезвляющую статью " Почему ваша компания не должна использовать git подмодули", из Amber Yust (также на SO).
Только один маленький экстракт, для ударов и хихиканья (удар мой):
Когда вы вызываете
git submodule update
, он смотрит в родительский репозиторий для SHA для каждого подмодуля, переходит в эти подмодули и проверяет соответствующие SHA.
Как и в случае, если вы проверили SHA в регулярном репозитории, это переводит подмодуль в автономное состояние HEAD.Если вы затем внесите изменения в подмодуль и зафиксируете, то git с радостью создаст фиксацию... и оставит вас еще с отдельной головкой. Смотрите, где это еще происходит?
Скажите, что вы объединились в некоторые другие изменения, которые включают в себя еще одно обновление подмодуля. Если вы еще не внесли свой собственный подмодуль в родительский проект, git не рассмотрит вашу новую фиксацию в подмодуле в качестве конфликта, а , если вы запустите
git submodule update
, он с радостью уничтожит вашу фиксацию без предупреждения, заменив это с тем из ветки, которую вы только что объединили в.Я надеюсь, что у вас есть подмодули
reflog
включены или все еще имеют старую фиксацию в прокрутке вашего терминала, , потому что в противном случае вы просто потеряли всю работу, которую вы сделали.
Err... "ouch".
Обратите внимание, что теперь подмодуль может отслеживать последние из ветки: см. git отслеживание подмодулей последних".