是否有可能强制更新git子模块?

时间:2013-08-06 21:22:12

标签: git git-submodules

我们有一个git存储库,它依赖于其他git存储库中的代码。我们使用子模块(通常的方式)来表达这种关系,并确保支持代码位于用户目录结构中的标准位置。更新支持代码非常简单:

  • 对子模块进行更改
  • 提交
  • 推它
  • 进入主存储库
  • 将更改提交到子模块
  • 推它

问题来自另一方面。在进行这种更改之后,为了让其他开发人员获得完整,一致的代码集,他们需要执行三个命令:

  • git pull(更新主存储库)
  • git submodule init(如果添加了任何新的子模块)
  • git submodule update(更新子模块)

事实证明,培训开发人员很难完成所有这些工作,特别是因为在我们所有其他不包含子模块的存储库中,拉动就足够了。结果是开发人员有时使用使用过时版本的子模块的代码,导致虚假问题,这可能是耗时的追踪。除了编写一个执行所有三个命令的shell脚本并且坚持使用这个!"以使其更加自动化之外,还有什么方法呢?

2 个答案:

答案 0 :(得分:4)

您可以尝试让同事:

git config --global fetch.recurseSubmodules on-demand

来自git config man page

fetch.recurseSubmodules

  

此选项可以设置为布尔值,也可以设置为按需。

     
      
  • 将其设置为布尔值会将fetch和pull的行为更改为无条件地在设置为true时递归到子模块或在设置为false时根本不递归。
  •   
  • 当设置为按需(默认值)时,fetch和pull将仅在其超级项目检索更新子模块引用的提交时递归到填充的子模块中。
  •   

另一种选择是让他们做一个更复杂的命令:

git pull --recurse-submodules=on-demand

上面提到的git config设置的优势在于允许开发人员执行简单的git pull

答案 1 :(得分:1)

我可以想到两个解决方案。

编写脚本:

#!/bin/sh

git pull
git submodule init
git submodule update

添加一个git别名:

#in ~/.gitconfig
[alias] update-all = !git pull && git submodule init && git submodule update