我有一个包含多个子模块的git repo。其中一个子模块有自己的多个子模块。我要做的就是检查一下master repo上的旧提交,并检查所有子模块中的相应提交,以获得当时代码的正确状态。
我知道git包含必要的信息,因为ls-tree
命令可以告诉我每个子模块在哪个提交。但是,我必须手动检查每一个,这非常耗费时间。
我正在寻找类似git checkout --recursive
的东西,但这样的命令似乎不存在。
有没有这样做?
答案 0 :(得分:25)
您需要两个命令才能实现此目的:
git checkout *oldcommit*
git submodule update --recursive
答案 1 :(得分:14)
注意:如果您有多个子模块(以及子模块内的子模块),Git 2。14(2017年第3季度)将有所帮助(更近期是2013年的OP)
git checkout --recurse-submodules
使用
--recurse-submodules
将根据超级项目中记录的提交更新所有已初始化的子模块的内容。
如果子模块中的本地修改将被覆盖,则除非使用-f
,否则结帐将失败。
" git checkout --recurse-submodules
"与...不太合作
子模块本身有子模块。它将与Git 2.14。
注意:使用Git 2.19(Q8 2018),git checkout --recurse-submodules another-branch
更健壮
之前,它没有报告哪个子模块无法更新工作树,导致无效的错误消息。
commit ba95d4e见Stefan Beller (stefanbeller
)(2018年6月20日)
(由Junio C Hamano -- gitster
--合并于commit 392b3dd,2018年7月24日)
中发生错误的子模块
submodule.c
:报告更新子模块的工作树时发生错误
submodule_move_head
,告诉用户 中发生错误的子模块。对
read-tree
的调用包含超级前缀,以便read-tree
将正确报告任何路径相关的问题,但一些错误消息 不包含路径,例如:~/gerrit$ git checkout --recurse-submodules origin/master ~/gerrit$ fatal: failed to unpack tree object 07672f31880ba80300b38492df9d0acfcd6ee00a
提示哪个子模块有问题。
答案 2 :(得分:6)
根据旧结帐中是否有更多子模块,您可能必须执行以下操作来初始化新提交中不再存在的子模块:
git checkout *oldcommit*
git submodule init
git submodule update --recursive