Git递归更新子模块


282

我的项目结构

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)

我如何递归更新子模块?我已经尝试了一些git命令(在ProjectA根目录上)

git submodule foreach git pull origin master

要么

git submodule foreach --recursive git pull origin master

但无法提取Twig文件。


Answers:


607
git submodule update --recursive

您可能还想使用--init选项,这将使它初始化所有未初始化的子模块:

git submodule update --init --recursive

注意:在某些较旧的Git版本中,如果使用该--init选项,则可能不会更新已初始化的子模块。在这种情况下,您还应该运行不带--init选项的命令。


1
递归添加子模块怎么样?“ git子模块添加FrameworkA.git”只是提取FrameworkA的文件。
complez 2012年

2
您可以只执行“ git子模块添加等等”,然后执行“ git子模块更新--init --recursive”。
drewag

这和我下面的方式不同吗?
William Entriken 2013年

3
@Irineau有关已初始化的子模块(如果--init使用的话)不会更新的说明与我在Git 2.2.2上的经验不符。我在使用时会看到已经初始化过的顶层子模块和嵌套子模块,都可以检出正确的提交git submodule update --init --recursive,我认为需要使用和不使用运行命令的说法--init是错误的。除非有人能证明这是行为,或者证明它在版本之间已更改且曾经是真实的,否则我计划将其完全删除。
Mark Amery

3
@MarkAmery,我记得这是我不记得的某些版本的git中的问题。我刚刚在1.9.3中对其进行了测试,该问题似乎不再存在。我更新了答案以引用模糊的“旧版本”。如果任何人都可以指定哪个版本更改了此行为,那就太好了。
drewag

35

我使用的方式是:

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master

6
我将最后一行更改为:git submodule foreach git pull --ff-only origin master
Gilad Peleg,2014年

2
我还将在最后一行添加--recursive:“ git子模块foreach --recursive git merge origin master”,否则当它本身更新了子模块时,您可能会得到一个肮脏的子模块。
Michael Scott Cuthbert

过去三个小时一直在寻找。谢谢你,先生。要添加此内容,您还可以使用以下命令进行提交,例如:git submodule foreach --recursive 'git commit -a | :'。将:使其循环,无论结果。请参阅链接stackoverflow.com/questions/19728933/…
雏鸟皮江(Pledgeon Pidgeon)

17

可能会发生子模块的默认分支 打开的情况master(在我的情况下这经常发生),这就是我自动完成整个Git子模块升级的方式:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

我试图在通用Makefile中添加此命令,但是我仍然坚持让GNU Make 忽略 $(...)序列的解释,尽管它包含在简单的引号中。有人有主意吗?
塞巴斯蒂安·瓦雷特

您的命令就是我所需要的,谢谢!但我知道: 子模块Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.在哪里Core
Sanandrea'5

另外,我想您需要弄清楚这个评论stackoverflow.com/a/18008139/3383543
艾哈迈德·阿尔·穆格拉比

没有递归选项意味着这仅在子模块不再包含子模块时才有效。
erikbwork

15

在最近的Git中(我正在使用v2.15.1),以下内容将递归地将上游子模块更改合并到子模块中:

git submodule update --recursive --remote --merge

您可以添加--init以初始化所有未初始化的子模块,并--rebase在要重新设置基础而不是合并时使用。

您需要随后提交更改:

git add . && git commit -m 'Update submodules to latest revisions'

我以为我做错了什么,但您的回答向我证实了git submodule update --remote my-dir/my-submodule同样有效
iomv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.