如何在GIT中更新子模块

29

以下代码是否足以更新子模块:

git submodule sync
git submodule update --init --recursive

我执行了主项目的git pull操作。

然后我执行

git submodule sync
git submodule update --init --recursive

更新子模块。

这段代码够用吗?

1个回答

35
您可以简单地使用git submodule foreach git pull来在下载后保持它们的更新。
要与主项目一起获取它们,您可以使用--recursive参数运行git clone命令,或者在克隆包含它们的repo之后使用命令git submodule update --init
编辑:
我更愿意查看文档,以充分了解上述命令之间的区别,但我也会尝试在下面解释它们。 git submodule update命令执行以下操作:
更新已注册的子模块以匹配超级项目所期望的内容,通过克隆缺失的子模块和更新子模块的工作树。
这意味着它不会将子模块更新为最新可用版本,而是检出超级项目期望使用的实际提交。
另一方面,命令git submodule foreach
在每个已检出的子模块中评估任意shell命令。
因此,假设OP知道git pull命令的作用,结合使用可以轻松推断出它们的组合实际上可以将所有子模块更新到最新的可用提交。有关更多详细信息,请参见上面的链接。

1
"git submodule foreach git pull"与"git submodule update"非常不同。解释一下它们的区别是值得的。 - Tavian Barnes
完成,即使在这种情况下只有官方文档也没有清晰的内容。;-) - skypjack
2
当我尝试使用变量 git submodule foreach git fetch 时,更改被获取了,但是当我运行 git submodule foreach git pull 时,我遇到了一个错误:您当前不在任何分支上。 请指定您想要合并的分支。 - U. Windl
3
解决了我的问题:子模块仓库实际上处于“分离的 HEAD”状态,所以我将 HEAD 添加到一个分支中,然后从子模块目录中拉取该分支。 - U. Windl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接