我们正在使用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)。
**注:这是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
是最新的分支,等等。
在这之后,创建一个简单的脚本,做以下事情。
git submodule status
的"modified"存储库。 输出行的第一个字符表示这一点。 如果一个子库被修改,你可能不想继续。
2.对于列出的每个 repo,cd进入它的目录,运行git checkout master && git pull
。 检查是否有错误。
3.3.在最后,我建议你打印一个显示给用户,以表明子模块的当前状态--也许提示他们添加所有并提交?我想说的是,这种风格并不是git子模块设计的真正目的。 通常,你想说"LibraryX"是在"2.32"版本,并将保持这种状态直到我告诉它"升级"。
从某种意义上说,这就是你用所述的脚本所做的事情,只是更加自动而已。 需要注意的是!
更新2:
如果你是在windows平台上,你可能想用Python来实现这个脚本,因为它在这些方面很有能力。 如果你是在unix/linux上,那么我建议只用bash脚本。
需要任何澄清吗? 请发表评论。