拉出所有git子模块的最新版本的简单方法

我们正在使用git子模块来管理几个大型项目,这些项目与我们开发的许多其他库有依赖关系。每个库都是一个单独的 repo,作为一个子模块进入依赖项目。在开发过程中,我们经常想去抓取每个依赖的子模块的最新版本。

git有沒有一個內置的命令來做這個? 如果没有,那么一个Windows批处理文件或类似的文件可以做到这一点吗?

解决办法

如果这是***第一次签出回购,你需要先使用--init

git submodule update --init --recursive

对于git 1.8.2或以上版本,增加了选项--remote,以支持更新到远程分支的最新提示。

git submodule update --recursive --remote

这有一个额外的好处,即尊重在".gitmodules "或".git/config "文件中指定的任何"非默认"分支(如果你碰巧有任何分支,默认是origin/master,在这种情况下,这里的一些其他答案也可以工作)。

对于git 1.7.3或以上版本,你可以使用(但下面关于更新的问题仍然适用)。

git submodule update --recursive

或。

git pull --recurse-submodules

如果你想把你的子模块拉到最新提交的版本,而不是 repo 指向的内容。

详情见git-submodule(1)

评论(20)

**注:这是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内部没有这样的命令。 为了做到这一点,你需要确定一个子模块的HEAD是什么。 这可能很简单,比如说master是最新的分支,等等。

在这之后,创建一个简单的脚本,做以下事情。

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

我想说的是,这种风格并不是git子模块设计的真正目的。 通常,你想说"LibraryX"是在"2.32"版本,并将保持这种状态直到我告诉它"升级"。

从某种意义上说,这就是你用所述的脚本所做的事情,只是更加自动而已。 需要注意的是!

更新2:

如果你是在windows平台上,你可能想用Python来实现这个脚本,因为它在这些方面很有能力。 如果你是在unix/linux上,那么我建议只用bash脚本。

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

评论(6)

我想你必须写一个脚本来做这件事。说实话,我可能会安装python来做,这样你就可以用os.walkcd到每个目录并发出适当的命令。使用python或其他脚本语言,而不是批处理,将使你能够轻松地添加/删除子项目,而不必修改脚本。

评论(0)