2013-02-27 104 views
14

我有一个与多个子​​模块的git回购。其中一个子模块有其自己的多个子模块。我所要做的就是检查主repo上的旧提交,并让它检出所有子模块的相应提交,以便当时获得正确的代码状态。如何检出包括所有子模块的旧git提交递归?

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

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

有没有办法做到这一点?

+0

注意:'git checkout --recurse-submodules'现在确实存在(2017)。但只有即将推出的Git 2.14才能正常工作。请参阅[我的答案](https://stackoverflow.com/a/44249558/6309)。 – VonC 2017-05-29 19:52:14

回答

17

你需要两个命令来实现这一目标:

git checkout *oldcommit* 
git submodule update --recursive 
+1

非常感谢!当然,结果很简单。 – 2013-02-27 23:34:15

4

取决于是否有更多的子模块在旧结账时,你可能需要做以下初始化不存在任何更多的子模块新提交:

git checkout *oldcommit* 
git submodule init 
git submodule update --recursive 
6

注意:如果你有多个子模块(和子模块内的子模块),Git的2.14(Q3 2017)将有助于(更近,从2013年OP)

git checkout --recurse-submodules 

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

git checkout --recurse-submodules”没有相当的工作与 子模块本身有子模块。它将与Git 2.14。

+0

我不明白为什么'-f'总是有必要的。没有'-f'它不会更新子模块。 – linquize 2017-08-06 05:31:40

+0

@linquize只有在子模块中有任何本地修改时,'-f'才有必要。 – VonC 2017-08-06 05:38:02