Как работает подмодуль git

В файле .gitmodule указывается URL-адрес репозитория модуля. Как git submodule знать, какую версию скачать? Кажется, что он всегда проверяет последнюю версию. Затем, как разработчики обеспечивают совместимость между основным проектом и дополнительными модулями?

Ответ 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 отслеживание подмодулей последних".