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

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


当前回答

windows 2.6.3的Git:

git子模块更新--rebase--remote

其他回答

如果是第一次签出回购,则需要使用--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)

我想你必须写一个剧本才能做到这一点。老实说,我可能会安装python,这样您就可以使用os.walk来cd到每个目录并发出相应的命令。使用python或其他脚本语言(而不是批处理),可以轻松添加/删除子项目,而无需修改脚本。

我通过修改上面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中有一个示例。

以下内容在Windows上适用。

git submodule init
git submodule update

下面是从所有git存储库中提取的命令行,无论它们是否是子模块:

ROOT=$(git rev-parse --show-toplevel 2> /dev/null)
find "$ROOT" -name .git -type d -execdir git pull -v ';'

如果您在顶级git存储库中运行它,可以将“$ROOT”替换为。。