Почему обновление подмодуля 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, давайте различать часть выборки, которая влияет на заполненные подмодули, и обновление рабочих деревьев, которое влияет только на активные подмодули.

Другие вопросы по тегам