Что следует запустить первым обновлением подмодуля git или инициализацией подмодуля git?

Я вижу здесь #https://github.com/UCSD-PL/proverbot9001/issues/73 :

# run git submodule update and the && makes sure init is only ran if the first worked
git submodule update && git submodule init  
# https://github.com/UCSD-PL/proverbot9001/issues/73

Но я считаю, что это правильный/безопасный/более стандартный способ:


# - git submodule init initializes your local configuration file to track the submodules your repository uses, it just sets up the configuration so that you can use the git submodule update command to clone and update the submodules.
git submodule init
# - The --remote option tells Git to update the submodule to the commit specified in the upstream repository, rather than the commit specified in the main repository. ref: https://stackoverflow.com/questions/74988223/why-do-i-need-to-add-the-remote-to-gits-submodule-when-i-specify-the-branch?noredirect=1&lq=1
git submodule update --init --recursive --remote
# - for each submodule pull from the right branch according to .gitmodule file. ref: https://stackoverflow.com/questions/74988223/why-do-i-need-to-add-the-remote-to-gits-submodule-when-i-specify-the-branch?noredirect=1&lq=1
git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master || echo main )'
# - check it's in specified branch. ref: https://stackoverflow.com/questions/74998463/why-does-git-submodule-status-not-match-the-output-of-git-branch-of-my-submodule
git submodule status

я прав? Я хотел бы быть исправленным или знать хорошие практики для этого.


крест:


1
131
2

Ответы:

Вы правы, init следует запускать перед update.

Как указано в документации, init будет

Инициализируйте подмодули, записанные в индексе (которые были добавлены и зафиксированы в другом месте), установив submodule.$name.url в .git/config. Он использует те же настройки из .gitmodules в качестве шаблона.

Другими словами, init устанавливает конфигурацию, которая будет использоваться update. Если вы не вносите никаких локальных изменений в эту конфигурацию, вы также можете просто запустить update --init. Смотрите документы

Если подмодуль еще не инициализирован, и вы просто хотите использовать настройку, хранящуюся в .gitmodules, вы можете автоматически инициализировать подмодуль с помощью параметра --init.


Решено

Более простой инструкцией для репозитория UCSD-PL/proverbot9001 , который ссылается на множество подмодулей (ср. его файл .gitmodules ), было бы просто использовать опцию git clone --recurse-submodules :

Это сделает все: клонирует родительский репозиторий, инициализирует все подмодули и обновляет их. Все за один раз.

Как объяснено в разделе «В чем смысл ‘git submodule init’?», разделение обоих шагов (инициализация и обновление) имеет смысл, когда вам не нужны все подмодули (потому что для их клонирования потребуется слишком много времени/ресурсов). ) и хотят работать только с подмножеством.

В таком случае да, инициализация должна быть до обновления.

Это взято из commit be4d2c8, Git v1.5.6-rc0, май 2008 г.

submodule update: добавить удобный вариант --init

Когда подмодуль не инициализирован и вы не хотите изменять по умолчанию из .gitmodules в любом случае, теперь вы можете сказать

$ git submodule update --init <name>

Когда «update» вызывается без --init в неинициализированном подмодуле, выводится подсказка по использованию --init.