54

我有一个带有多个子模块的 git repo。这些子模块之一有它自己的多个子模块。我要做的就是检查主存储库上的旧提交,并让它检查来自所有子模块的适当提交,以获得当时代码的正确状态。

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

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

有没有办法做到这一点?

4

3 回答 3

59

您需要两个命令来实现这一点:

git checkout *oldcommit*
git submodule update --recursive

更新:截至 2018 年,此答案已过时 -有关更多当前信息,请参阅下面的 VonC 答案。

于 2013-02-27T23:17:30.717 回答
45

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

git checkout --recurse-submodules

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

" git checkout --recurse-submodules" 不适用于本身具有子模块的子模块。它将与 Git 2.14 一起使用。


注意:使用 Git 2.19(2018 年第三季度)git checkout --recurse-submodules another-branch更强大。
之前,它没有报告在哪个子模块中更新工作树失败,这导致了一个无用的错误消息。

请参阅Stefan Beller ( ) 的提交 ba95d4e(2018 年 6 月 20 日(由Junio C Hamano 合并——提交 392b3dd中,2018 年 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

提示哪个子模块有问题。

于 2017-05-29T19:50:50.310 回答
12

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

git checkout *oldcommit*
git submodule init
git submodule update --recursive
于 2015-03-19T23:13:57.773 回答