我们使用git子模块来管理一些依赖于我们开发的许多其他库的大型项目。每个库都是一个单独的repo,作为子模块引入到依赖项目中。在开发过程中,我们经常想要获取每个依赖子模块的最新版本。

如何获取所有git子模块的最新更改?


当前回答

如果是第一次签出回购,则需要使用--init first:

git submodule update --init --recursive

对于git1.8.2或更高版本,添加了选项--remote以支持更新到远程分支的最新提示:

git submodule update --recursive --remote

这还有一个额外的好处,那就是尊重.gitmodules或.git/config文件中指定的任何“非默认”分支(如果您碰巧有,默认值是origin/master,在这种情况下,这里的一些其他答案也会起作用)。

对于git 1.7.3或更高版本,您可以使用(但以下关于更新仍然适用的问题):

git submodule update --recursive

or:

git pull --recurse-submodules

如果您希望将子模块拉到最新的提交,而不是repo指向的当前提交。

详见git子模块(1)

其他回答

我不知道这是从哪个版本的git开始工作的,但这就是您正在搜索的:

git submodule update --recursive

我也使用git pull来更新根存储库:

git pull && git submodule update --recursive

我通过修改上面gahooa的回答做到了这一点:

将其与git〔alias〕集成。。。

如果您的父项目在.gitmodules中有类似的内容:

[submodule "opt/submodules/solarized"]
    path = opt/submodules/solarized
    url = git@github.com:altercation/solarized.git
[submodule "opt/submodules/intellij-colors-solarized"]
    path = opt/submodules/intellij-colors-solarized
    url = git@github.com:jkaving/intellij-colors-solarized.git

在.gitconfig中添加类似的内容

[alias]
    updatesubs = "!sh -c \"git submodule init && git submodule update && git submodule status\" "

然后,要更新子模块,请运行:

git updatesubs

我在环境设置repo中有一个示例。

我经常使用这个命令,到目前为止,它仍然有效。

git pull
git submodule foreach --recursive git checkout master
git submodule foreach --recursive git pull

希望能快点。

我编写了这个简单的shell脚本,对我来说很好。

#!/bin/bash

#git init
git init

#git clone repo including submodules
git clone --recurse-submodules https://github.com/username/project.git

#change directory -repo
cd project

#update the remote ie tag/commits
git submodule update --remote

#add commit 
git commit -a -m "commit in submodule"

#git push 
git push -u origin 

对我来说,git2.24.03,更新到.gitmodules中定义的远程分支的最新提交。

git子模块更新--递归--init

git子模块更新--递归--远程

git版本2.24.3(Apple git-128)

请注意:有人说过git pull-递归子模块与git子模块update-递归-远程相同。但根据我的测试,gitpull-recurse子模块可能不会更新为.gitmodules中定义的远程分支的最新提交。