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

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


当前回答

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

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

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”替换为。。

由于您的子模块的默认分支可能不是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结账

只需确保通过以下全局配置启用它:git-config--global submodule.recure true

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

git在1.8.5中首次学习的特性。

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

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

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