简单的方法来提取所有 git 子模块的最新信息

我们正在使用 git 子模块来管理几个依赖于我们开发的其他许多库的大型项目。每个库都是作为子模块带入相关项目的单独的存储库。在开发过程中,我们通常只想获取每个依赖子模块的最新版本。

git 有内置命令可以做到这一点吗?如果不是,那么可以执行 Windows 批处理文件或类似文件?

答案

如果这是您第一次签出--init需要先使用--init

git submodule update --init --recursive

对于git 1.8.2或更高--remote ,添加了--remote选项以支持更新到远程分支的最新提示:

git submodule update --recursive --remote

这具有.gitmodules.git/config文件中指定的任何 “非默认” 分支的附加好处(如果碰巧有任何分支,默认为 origin / master,在这种情况下,此处的其他一些答案也可以作为好)。

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

git submodule update --recursive

要么:

git pull --recurse-submodules

如果您想将子模块拉到最新版本,例如仓库指向的内容。

详见git-submodule(1)

git pull --recurse-submodules --jobs=10

git 在 1.8.5 中首次学习的功能。

错误修复之前,您第一次需要运行

git 子模块更新 --init --recursive

在初始化时运行以下命令:

git submodule update --init --recursive

从 git repo 目录中,最适合我。

这将拉动所有最新的包括子模块。

讲解

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            --init without the explicit init step if you do not intend to customize
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

之后,您可以运行:

git submodule update --recursive

从 git repo 目录中,最适合我。

这将拉动所有最新的包括子模块。

注意:这是从 2009 年开始的,那时可能还不错,但是现在有更好的选择。

我们用这个。这叫做git-pup

#!/bin/bash
# Exists to fully update the git repo that you are sitting in...

git pull && git submodule init && git submodule update && git submodule status

只需将其放在合适的 bin 目录中(/ usr / local / bin)。如果在 Windows 上,则可能需要修改语法才能使其起作用:)

更新:

为了回应原始作者关于引入所有子模块的所有 HEAD 的评论,这是一个好问题。

我很确定git在内部没有此命令。为此,您需要确定子模块的真正含义是什么。这可能很简单,例如说master是最新分支,等等。

之后,创建一个简单的脚本,该脚本执行以下操作:

  1. 检查git submodule status以查看 “已修改” 存储库。输出行的第一个字符表明了这一点。如果修改了子仓库,您可能不想继续。
  2. 对于列出的每个仓库,cd 进入它的目录并运行git checkout master && git pull 。检查错误。
  3. 最后,我建议您向用户打印显示以指示子模块的当前状态 - 也许提示他们添加所有并提交?

我想提一下,这种样式并不是 git 子模块真正设计的目的。通常,您想说 “LibraryX” 的版本是 “2.32”,并且会一直保持这种状态,直到我告诉它 “升级” 为止。

也就是说,从某种意义上讲,您正在描述的脚本中执行的操作只是自动进行的。需要小心!

更新 2:

如果您使用的是 Windows 平台,则可能要考虑使用 Python 来实现脚本,因为它在这些方面非常有能力。如果您使用的是 Unix / Linux,那么我建议您只使用 bash 脚本。

需要任何澄清吗?只需发表评论。

亨里克走在正确的轨道上。 “foreach” 命令可以执行任何任意的 shell 脚本。有两种选择可以获取最新的信息,

git submodule foreach git pull origin master

和,

git submodule foreach /path/to/some/cool/script.sh

这将遍历所有初始化的子模块并运行给定的命令。

以下在 Windows 上对我有用。

git submodule init
git submodule update

编辑

在评论中(由philfreo指出),需要最新版本。如果有任何嵌套子模块需要最新版本:

git submodule foreach --recursive git pull

----- 以下过时的评论 -----

这不是官方的方式吗?

git submodule update --init

我每次都用它。到目前为止没有问题。

编辑:

我刚刚发现您可以使用:

git submodule foreach --recursive git submodule update --init

这也将递归地拉动所有子模块,即依赖关系。

可能会发生子模块的默认分支不是 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'

第一次

克隆和初始化子模块

git clone git@github.com:speedovation/kiwi-resources.git resources
git submodule init

休息

在开发过程中,只需拉出并更新子模块

git pull --recurse-submodules  && git submodule update --recursive

将 Git 子模块更新为最新的原始提交

git submodule foreach git pull origin master

首选方式应该在下面

git submodule update --remote --merge

注意:最后两个命令具有相同的行为

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

git submodule update --recursive

我也将它与git pull一起使用来更新根存储库:

git pull && git submodule update --recursive