如何递归地检查包括所有子模块的旧git提交?

时间:2013-02-27 23:15:42

标签: git git-submodules

我有一个包含多个子模块的git repo。其中一个子模块有自己的多个子模块。我要做的就是检查一下master repo上的旧提交,并检查所有子模块中的相应提交,以获得当时代码的正确状态。

我知道git包含必要的信息,因为ls-tree命令可以告诉我每个子模块在哪个提交。但是,我必须手动检查每一个,这非常耗费时间。

我正在寻找类似git checkout --recursive的东西,但这样的命令似乎不存在。

有没有这样做?

3 个答案:

答案 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 ba95d4eStefan 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