我有一个带有多个子模块的 git repo。这些子模块之一有它自己的多个子模块。我要做的就是检查主存储库上的旧提交,并让它检查来自所有子模块的适当提交,以获得当时代码的正确状态。
我知道 git 包含必要的信息,因为该ls-tree
命令可以告诉我每个子模块在哪个提交上。但是,我必须手动检查每一个,这非常耗时。
我正在寻找类似的东西,git checkout --recursive
但这样的命令似乎不存在。
有没有办法做到这一点?
我有一个带有多个子模块的 git repo。这些子模块之一有它自己的多个子模块。我要做的就是检查主存储库上的旧提交,并让它检查来自所有子模块的适当提交,以获得当时代码的正确状态。
我知道 git 包含必要的信息,因为该ls-tree
命令可以告诉我每个子模块在哪个提交上。但是,我必须手动检查每一个,这非常耗时。
我正在寻找类似的东西,git checkout --recursive
但这样的命令似乎不存在。
有没有办法做到这一点?
您需要两个命令来实现这一点:
git checkout *oldcommit*
git submodule update --recursive
更新:截至 2018 年,此答案已过时 -有关更多当前信息,请参阅下面的 VonC 答案。
注意:如果您有多个子模块(以及子模块内的子模块),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
提示哪个子模块有问题。
根据旧结帐中是否有更多子模块,您可能必须执行以下操作来初始化新提交中不再存在的子模块:
git checkout *oldcommit*
git submodule init
git submodule update --recursive