我正在使用一些使用Git子模块的旧代码。该代码有几个不同的分支,这些分支正在被积极使用,并且这些分支中的每一个都不幸地依赖于相关子模块的不同修订; this has made development extremely complicated。我面临的一个问题是,当我在分支机构之间切换时,例如使用master
newfeature-foo
到git checkout newfeature-foo
,子模块的状态保持在master
的状态,这通常会导致编译错误,更糟糕的是会导致运行时行为的差异造成严重破坏用户测试和一般的理智。
例如,给定.gitmodules
配置:
[submodule "robotcontroller"]
path = robotcontroller
url = https://coolrobots.com/repos/robotcontroller
branch = master
ignore = dirty
master
引用robotcontroller @ f57d1b3
newfeature-foo
引用robotcontroller @ 60b27d4
master
根本没有子模块robotcontroller
newfeature-foo
引用robotcontroller @ bdf5991
没有办法,例如使用Git钩子强制自动完全重新检查.gitmodules
文件中列出的所有子模块,当它在结束时更改" root" Git存储库?
答案 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 mysubmodule
和git status
= clean