用于在分支更改时更新Git子模块的Git钩子

时间:2018-05-04 14:02:57

标签: git branch git-submodules githooks

我正在使用一些使用Git子模块的旧代码。该代码有几个不同的分支,这些分支正在被积极使用,并且这些分支中的每一个都不幸地依赖于相关子模块的不同修订; this has made development extremely complicated。我面临的一个问题是,当我在分支机构之间切换时,例如使用master newfeature-foogit checkout newfeature-foo,子模块的状态保持在master的状态,这通常会导致编译错误,更糟糕的是会导致运行时行为的差异造成严重破坏用户测试和一般的理智。

例如,给定.gitmodules配置:

[submodule "robotcontroller"]
    path = robotcontroller
    url = https://coolrobots.com/repos/robotcontroller
    branch = master
    ignore = dirty
  • 提交 77d4697 的分支master引用robotcontroller @ f57d1b3
  • b38d29f 的分支newfeature-foo引用robotcontroller @ 60b27d4
  • 873639f 的分支master根本没有子模块robotcontroller
  • 301dca4 的分支newfeature-foo引用robotcontroller @ bdf5991

没有办法,例如使用Git钩子强制自动完全重新检查.gitmodules文件中列出的所有子模块,当它在结束时更改" root" Git存储库?

2 个答案:

答案 0 :(得分:2)

post-checkout挂钩,删除robotcontroller并更新所有子模块。

#!/bin/sh

# post-checkout hook that update submodules

prev_HEAD="$1"
new_HEAD="$2"
new_branch="$3"

if [ "$new_branch" = 1 ]; then
   if ! grep -Fq robotcontroller .gitmodules; then
      rm -rf robotcontroller
   fi

   git submodule update
fi

exit 0

PS。根Git存储库的正确术语是“超级项目”。 : - )

答案 1 :(得分:0)

听起来你的回购中有很多事情让人感到困惑。我们可以经常进行大量反复查找相互矛盾的设置,但这就是我要做的事情:

摆脱ignore = dirty

这只是隐藏了有用的信息 - 也许子模块没有干净地检查,因为它会覆盖文件。至少,在对子模块进行任何操作之前确认该子模块是干净的 - cd mysubmodulegit status = clean