简单的方法来拉最新的所有git submodules

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

git是否有内置命令来执行此操作? 如果没有,那么Windows批处理文件或类似的可以做到这一点?


对于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

如果你想把你的子模块放到回购指向的最新提交。

注意:如果这是您第一次签出回购,您需要使用--init优先:

git submodule update --init --recursive

对于较老的git 1.6.1或更高版本,您可以使用类似的内容(修改为适合):

git submodule foreach git pull origin master

有关详细信息,请参阅git-submodule(1)


如果您需要将子模块的东西放入您的子模块存储库,请使用

git pull --recurse-submodules

git首先在1.7.3中学到了一个特性。

但是这不会在子模块中签出适当的提交(主存储库指向的那些提交)

要在您的子模块中签出适当的提交,您应该在使用后更新它们

git submodule update --recursive --remote

注意:这是从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是最新的分支一样简单......

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

  • 检查“已修改”存储库的git submodule status 。 输出行的第一个字符表示这一点。 如果一个子回购被修改,你可能不想继续。
  • 为每个列出的回购,cd到它的目录并运行git checkout master && git pull 。 检查错误。
  • 最后,我建议你打印一个显示给用户,以指示子模块的当前状态 - 可能会提示他们添加所有并提交?
  • 我想提一下,这种风格并不是真正的git子模块。 通常情况下,你想说“LibraryX”的版本是“2.32”,并保持这种状态,直到我告诉它“升级”为止。

    也就是说,从某种意义上说,你正在用所描述的脚本做什么,但更多的是自动完成。 需要小心!

    更新2:

    如果你在一个Windows平台上,你可能想看看使用Python来实现这个脚本,因为它在这些方面非常有用。 如果你使用的是unix / linux,那么我只是建议一个bash脚本。

    需要澄清? 只需发表评论。

    链接地址: http://www.djcxy.com/p/2697.html

    上一篇: Easy way to pull latest of all git submodules

    下一篇: How do I replace a git submodule with another repo?