Почему «обновление подмодуля git» должно пропускать подмодуль?

#git #git-submodules

#git #git-submodules

Вопрос:

У меня есть репозиторий git с одним подмодулем sub/x . (Этот подмодуль не содержит собственных подмодулей.)

В репозитории superproject вывод git status показывает следующую (неустановленную) модификацию

 modified:   sub/x (new commits)
 

Если я сейчас запущу

 git submodule update
 

… в суперпроекте следующая строка выводится на терминал (и ничего больше):

 Skipping submodule 'sub/x'
 

После этого вывод git status в суперпроекте остается, как показано выше, неизменным.

(То же самое, если я добавлю --init в git submodule update команду.)

Вопрос: Как я могу определить, почему git submodule update [--init] пропускается sub/x подмодуль?

Ответ №1:

(Примечание: я проверил только самую последнюю версию Git, и код подмодуля претерпевал изменения, так что это может быть не единственный случай. Но это единственное место, где это сообщение может появиться в последней версии Git.)

Редактировать 2: похоже, что приведенный ниже случай применим, когда в суперпроекте .git/config есть явная update = none настройка. Это имеет больше смысла, чем предположение, которое я сделал ниже; это первая половина || выражения здесь. Я предположил, что update = none настройки не было, и мы получали это из второй половины (не указано и type = NONE), и я все еще нахожу это запутанным.

(оригинальный ответ продолжается ниже)


Это сообщение появляется во вспомогательном коде подмодуля Git:

         if (suc->update.type == SM_UPDATE_NONE
            || (suc->update.type == SM_UPDATE_UNSPECIFIED
                amp;amp; update_type == SM_UPDATE_NONE)) {
                strbuf_addf(out, _("Skipping submodule '%s'"), displaypath);
                strbuf_addch(out, 'n');
                goto cleanup;
        }
 

Этот код срабатывает, когда в submodule.name.update суперпроекте .git/config для данного подмодуля не задан параметр, а тип обновления не указан ( git submodule update без --checkout ). Итак:

 git submodule update --checkout
 

переопределит это, как и настройка параметра обновления подмодуля на checkout . Редактировать: я не понимаю, почему код такой: в документации говорится, что значение по умолчанию равно checkout , и поведение по-разному с фактическим значением, установленным на checkout , по сравнению с значением по умолчанию checkout , похоже, не соответствует этому утверждению.

Комментарии:

1. Существует фактический none тип обновления, который он ищет

2. Это интересная идея; я не могу дождаться, чтобы попробовать ее. К сожалению, мне придется подождать до завтра, потому что система, в которой я это делаю, только что вышла из строя для обслуживания…

3. @jthill: есть, но, похоже, это применимо только к умолчанию ( SM_UPDATE_UNSPECIFIED ; Я сделал быстрый поиск). Существует также это странное понятие активных и неактивных подмодулей, но, похоже, это не относится к сообщению «пропуск». Я не понимаю намерения этого кода, поскольку в документации говорится, что unset означает проверку.

4. @jthill: конечно же, в .git/config файле суперпроекта были настройки update = none для sub/x подмодуля. Я понятия не имею, почему существует этот параметр. Я точно знаю, что я не добавлял его, вручную редактируя этот .git/config файл. Какая-то другая git команда должна добавить этот параметр в качестве побочного эффекта.

5. Ситуация, которая привела к появлению этого поста, имеет признаки моей фазы «быка в посудной лавке»: (1) репозиторий Git, который находится в странном состоянии, требующем часов и часов устранения неполадок, и (2) я не имею ни малейшего представления о том, как репозиторий попал в такоесостояние. Я вступил в такую фазу, когда начал использовать Git-with-submodules, но я прошел через очень похожую фазу (которая длилась неделями) несколько лет назад, когда я впервые начал использовать (обычный, т. Е. Без подмодулей) Git. …

Ответ №2:

Проверьте, игнорируется ли сам ваш подмодуль:

 git check-ignore -v -- sub/x
 

Проверьте также .gitmodules файл на наличие какой-либо ignore директивы.

Комментарии:

1. Спасибо, но оба они оказались пустыми. В моей версии git нет check-ignored , но есть check-ignore . Когда я запустил командную строку, которую вы опубликовали с check-ignore помощью вместо check-ignored , я не получил никаких результатов. .gitmodules Файл содержит только директивы path , url , и branch для этого одного модуля (и ничего больше).

2. @kjo Какая версия Git у вас есть? На какой ОС?

3. @kjo Есть ли sub/x/.git вложенная папка, которая создавала бы вложенный x репозиторий, в дополнение к его статусу подмодуля?

4. версия Git — 2.17.0; операционная система — Linux (CentOS); существует вложенный файл /x/.git, а не вложенная папка.

5. ОК. Первый тест для проверки, посмотрите, сохраняется ли проблема с git 2.28