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

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


当前回答

编辑:

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

git submodule foreach --recursive git pull

-----下面的过期评论-----

这不是官方的做法吗?

git submodule update --init

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

编辑:

我刚刚发现你可以使用:

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

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

其他回答

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

在init上运行以下命令:

git submodule update --init --recursive

在gitrepo目录中,最适合我。

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

解释

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

在gitrepo目录中,最适合我。

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

根据从远程获取每个子模块的“最新”代码的现有答案,澄清一些问题。

如果“最新”是指签入的子模块指针,则无论如何使用:

git submodule update --recursive
  - or -
git pull --recurse-submodules --jobs=X

如果“最新”是指main的最新版本,那么类似这样的内容可以起作用:

git submodule foreach "git checkout main && git pull"

不幸的是,这意味着没有“--jobs”选项,因此我们无法并行运行它。我所看到的最接近并行运行的方法是使用pfs-python代码。

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

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

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

上面的答案很好,不过我们使用了git钩子来简化这一过程,但事实证明,在git2.14中,您可以将git-config子模块.recure设置为true,以便在您拉到git存储库时更新子模块。

如果所有子模块都在分支上,这会产生一个副作用,即推动所有子模块的更改,但如果您已经需要这种行为,这可以完成任务。

可通过以下方式完成:

git config submodule.recurse true