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

Ben*_*ron 24 git git-submodules

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

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

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

反正有没有这样做?

Chr*_*ial 31

您需要两个命令来实现此目的:

git checkout *oldcommit*
git submodule update --recursive
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!当然,事实证明这很简单。 (2认同)

Von*_*onC 19

注意:如果您有多个子模块(以及子模块内的子模块),Git 2.14(2017年第3季度)将有所帮助(更近期是2013年的OP)

git checkout --recurse-submodules
Run Code Online (Sandbox Code Playgroud)

使用--recurse-submodules将根据超级项目中记录的提交更新所有初始化子模块的内容.
如果子模块中的本地修改将被覆盖,则除非-f使用,否则检出将失败.

" git checkout --recurse-submodules"对于本身有子模块的子模块不太适用.它将与Git 2.14.


注意:使用Git 2.19(Q8 2018),git checkout --recurse-submodules another-branch更加强大.
之前,它没有报告哪个子模块无法更新工作树,导致无效的错误消息.

Stefan Beller()提交ba95d4e(2018年6月20日).(由Junio C Hamano合并- -提交392b3dd,2017年7月24日)stefanbeller
gitster

submodule.c:报告发生错误的子模块

更新子模块的工作树时发生错误 submodule_move_head,告诉用户发生错误的子模块.

调用read-tree包含超级前缀,以便read-tree 正确报告任何与路径相关的问题,但某些错误消息不包含路径,例如:

~/gerrit$ git checkout --recurse-submodules origin/master
~/gerrit$ fatal: failed to unpack tree object 07672f31880ba80300b38492df9d0acfcd6ee00a
Run Code Online (Sandbox Code Playgroud)

给出提示哪个子模块有问题.


Tho*_*mas 8

根据旧结帐中是否有更多子模块,您可能必须执行以下操作来初始化新提交中不再存在的子模块:

git checkout *oldcommit*
git submodule init
git submodule update --recursive
Run Code Online (Sandbox Code Playgroud)

  • 你救了我的命,先生! (2认同)