#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