Почему обновление подмодуля git не выполняется автоматически при проверке git?
При переключении веток с помощью git checkout я бы предположил, что большую часть времени вы захотите обновить свои подмодули.
- В какой ситуации вы не хотите обновлять субмодули после переключения?
- Что бы сломалось, если бы это было сделано автоматически git checkout?
Обновлено с примером:
- Ветвь A имеет подмодуль S в 3852f1
- Ветка B имеет подмодуль S в fd72d7
В ветви A проверка git B приведет к созданию рабочей копии ветви B с подмодулем S в 3852f1 (с измененным S). Обновление подмодуля git будет проверять S на fd72d7.
2 ответа
Я считаю, что субмодули, которые не обновляются автоматически, соответствуют целям разработки Git. Git предназначен для работы в распределенном режиме и не предполагает, что вы даже можете подключиться к нелокальному репозиторию, если вы не указали это явно. Git не автоматически обновляет подмодуль будет ожидаемым поведением, если подумать об этом.
С учетом вышесказанного, если вы знаете, что вы всегда хотите, чтобы эти субмодули были извлечены, и вы знаете, что вы никогда не будете переходить из этих субмодулей в другой локальный репозиторий, то ничего не сломается, если вы автоматически обновите их после проверка.
git checkout --recurse-submodules
воля была добавлена в мерзавец 2.13
Это упоминается в примечаниях к выпуску по адресу: https://github.com/git/git/commit/e1104a5ee539408b81566066aaa6963cb87d5cd6
submodule.recurse
опция была добавлена в git 2.14
Установить как:
git config --global submodule.recurse true
man git-config
говорит:
Указывает, будут ли команды повторяться в подмодулях по умолчанию. Это относится ко всем командам, которые имеют
--recurse-submodules
вариант. По умолчанию false.
В Git 2.27 (второй квартал 2020 г.) "--recurse-submodules
"вариант лучше документирован.
Смотрите фиксацию acbfae3, фиксацию 4da9e99, фиксацию d09bc51, фиксацию b3cec57, фиксацию dd0cb7d (6 апреля 2020 г.) Дэмиен Роберт (damiens-robert
).
(Слияние Junio C Hamano -gitster
- в коммите cc908db, 28 апр 2020 г.)
doc
:--recurse-submodules
в основном относится к активным субмодулямПодписано: Дэмиен Роберт
Помощник: Филипп БлейнВ документации упоминаются "инициализированные" или "заполненные" подмодули, чтобы объяснить, на какие подмодули влияет '
--recurse-submodules
', но настоящая терминология здесь'active
подмодули. Обновите документацию соответствующим образом.Немного терминологии:
- Active определен в gitsubmodules (7), он включает только переменные конфигурации '
submodule.active
','submodule.<name>.active
' а также 'submodule.<name>.url
'.
Функцияsubmodule.c::is_submodule_active
проверяет, что подмодуль активен.- Заполнено означает, что рабочее дерево подмодуля присутствует (и gitfile правильно указывает на репозиторий подмодуля), т.е. либо суперпроект был клонирован с помощью
--recurse-submodules
, или пользователь запустилgit submodule update --init
, илиgit submodule init [<path>]
а такжеgit submodule update [<path>]
отдельно, который заполняет рабочее дерево подмодуля.
Это не касается трех переменных конфигурации, указанных выше.- Инициализированный (по крайней мере, в контексте страниц руководства, задействованных в этом патче) означает как "заполненный", так и "активный", как определено выше, т.е.
[
git обновление подмодуля --init](https://git-scm.com/docs/git-submodule)
делает.В
--recurse-submodules
Опция в основном влияет на активные подмодули.Исключением является
git fetch
где параметр влияет на заполненные подмодули.
Как следствие, вgit pull --recurse-submodules
выборка влияет на заполненные подмодули, но результирующее обновление рабочего дерева влияет только на активные подмодули.В документации
git-pull
, давайте различать часть выборки, которая влияет на заполненные подмодули, и обновление рабочих деревьев, которое влияет только на активные подмодули.