Ответ 1
Для этого вам нужны две команды:
git checkout *oldcommit*
git submodule update --recursive
Обновление: Этот ответ устарел по состоянию на 2018 г. - более подробную информацию см. в ответе VonC ниже.
У меня есть репозиторий git с несколькими подмодулями. Один из этих подмодулей имеет несколько подмодулей. Все, что я хочу сделать, это проверить старую фиксацию на мастер-репо и проверить ее соответствующие коммиты со всех подмодулей, чтобы получить правильное состояние кода в это время.
Я знаю, что git содержит информацию, необходимую, поскольку команда ls-tree
может сказать мне, что зафиксировать каждый подмодуль. Тем не менее, мне приходится вручную проверять каждый из них, что требует много времени.
Я ищу что-то вроде git checkout --recursive
, но такая команда не существует.
Есть ли способ сделать это?
Для этого вам нужны две команды:
git checkout *oldcommit*
git submodule update --recursive
Обновление: Этот ответ устарел по состоянию на 2018 г. - более подробную информацию см. в ответе VonC ниже.
Примечание: если у вас есть несколько подмодулей (и подмодулей внутри подмодулей), 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
Дайте подсказку, в каком подмодуле возникла проблема.
В зависимости от того, есть или нет подмодулей в старой проверке, вам может потребоваться сделать следующее, чтобы инициализировать подмодули, которых нет в новых коммитах:
git checkout *oldcommit*
git submodule init
git submodule update --recursive