Как проверить старый git commit, включая все подмодули рекурсивно? - программирование
Подтвердить что ты не робот

Как проверить старый git commit, включая все подмодули рекурсивно?

У меня есть репозиторий git с несколькими подмодулями. Один из этих подмодулей имеет несколько подмодулей. Все, что я хочу сделать, это проверить старую фиксацию на мастер-репо и проверить ее соответствующие коммиты со всех подмодулей, чтобы получить правильное состояние кода в это время.

Я знаю, что git содержит информацию, необходимую, поскольку команда ls-tree может сказать мне, что зафиксировать каждый подмодуль. Тем не менее, мне приходится вручную проверять каждый из них, что требует много времени.

Я ищу что-то вроде git checkout --recursive, но такая команда не существует.

Есть ли способ сделать это?

4b9b3361

Ответ 1

Для этого вам нужны две команды:

git checkout *oldcommit*
git submodule update --recursive

Обновление: Этот ответ устарел по состоянию на 2018 г. - более подробную информацию см. в ответе VonC ниже.

Ответ 2

Примечание: если у вас есть несколько подмодулей (и подмодулей внутри подмодулей), Git 2.14 (3 квартал 2017 г.) поможет (более поздняя версия, чем OP от 2013 г.)

git checkout --recurse-submodules

Использование --recurse-submodules обновит содержимое всех инициализированных подмодулей в соответствии с фиксацией, записанной в суперпроекте.
Если локальные изменения в подмодуле будут перезаписаны, проверка не будет выполнена, если не используется -f.

"git checkout --recurse-submodules" не совсем работал с субмодуль, который сам имеет подмодули. Это будет с Git 2.14.


Примечание: с Git 2.19 (Q3 2018), git checkout --recurse-submodules another-branch является более надежным.
Ранее он не сообщал, в каком подмодуле не удалось обновить рабочее дерево, что привело к бесполезному сообщению об ошибке.

См. коммит ba95d4e (20 июня 2018 года) Стефаном Беллером (stefanbeller).
(Merged by Junio C Hamano -- [TG46] -- in commit 392b3dd, 24 Jul 2018)

submodule.c: сообщить субмодулю, что в

произошла ошибка Когда происходит ошибка при обновлении рабочего дерева субмодуля в submodule_move_head, сообщите пользователю , в каком субмодуле произошла ошибка в.

Вызов к read-tree содержит супер-префикс, так что read-tree будет правильно сообщать о любых проблемах, связанных с путем, но некоторые сообщения об ошибках не содержат пути, например:

~/gerrit$ git checkout --recurse-submodules origin/master
~/gerrit$ fatal: failed to unpack tree object 07672f31880ba80300b38492df9d0acfcd6ee00a

Дайте подсказку, в каком подмодуле возникла проблема.

Ответ 3

В зависимости от того, есть или нет подмодулей в старой проверке, вам может потребоваться сделать следующее, чтобы инициализировать подмодули, которых нет в новых коммитах:

git checkout *oldcommit*
git submodule init
git submodule update --recursive