我有一个git repo和第二个repo作为子模块。两个存储库都有对应的分支以表示各种功能,这些功能通常非常直接地对应,例如,如果父仓库位于分支A上,则子模块也将位于分支A上。
在父模块和子模块存储库中,随着时间的推移,会添加更多分支,有时我会将较旧的分支合并到较晚的分支中,例如在两个存储库中定期将分支A合并到分支B中,而分支B也在获取不在A中的新提交。
在更新了A子模块之后,当我将分支A合并到父仓库的B中时,问题就来了。我想忽略这些更新(即,我一直想在合并过程中放弃子模块更新,否则父分支B可能会以错误的子模块分支A结尾)。
我发现了一些instructions用于合并文件时如何始终使用“我们的”,但是对于子模块而言似乎无效。重现子模块问题的方法如下:
# first command will update your ~/.gitconfig, you may want to undo it later
git config --global merge.ours.driver true
mkdir -p tmp/sub
cd tmp
git init
git commit --allow-empty -m "chore: Initial commit"
echo 'sub merge=ours' >> .gitattributes
git add .gitattributes
git commit -m 'chore: Preserve sub during merges'
mkdir sub
pushd sub
git init
git commit --allow-empty -m "sub: init"
popd
git submodule add ./sub
git commit -m 'add submodule'
git checkout -b demo-prod
pushd sub
echo prod > readme
git add readme
git commit -m 'add prod readme'
popd
git commit sub -m 'sub: add prod readme'
git checkout -
git submodule update
pushd sub
echo master > log
git add log
git commit -m 'add master log'
popd
git commit sub -m 'sub: add master log'
git checkout demo-prod
git merge -
预期结果是自动合并,但实际结果是合并冲突,因为“ sub”在父存储库的两个分支中都有新的提交。
在这种情况下如何实现轻松合并?
答案 0 :(得分:0)
与子模块的合并已在t7405-submodule-merge.sh
中进行了测试,并且始终包含merge -s ours
,它应该可以完成您想要的操作。
(测试于commit f37ae35中添加,2009年4月,Git v1.6.2.4)
在was discussed in Nov. 2017(2018年1月,v2.17.0-rc0)中,this patch的子模块commit 6c8647d的实际合并,但是您在这里不需要它。
使用merge strategy“ -s ours
”可能太多(因为它忽略了另一个分支的 all 提交),但是合并递归策略选项可以帮助: git merge -X ours
。
答案 1 :(得分:0)
在更新了A子模块之后,当我将分支A合并到父仓库的B中时,问题就来了。我想忽略[任何branch-A子模块]更新(即,我一直想在合并过程中放弃子模块的更新,否则父分支B可能会以错误的子模块分支A结尾)。
合并时,如果在另一个分支中更改了路径但在本地分支中完全未触及Git,则看不到冲突的机会,因此“平凡”地采用了另一个分支版本。到目前为止,这是在雷达之下Git甚至没有将其视为自动合并,它根本不运行任何合并驱动程序,据我所知,没有什么可以关闭的,您无法停止它,……>
…看起来像是扁平化的“无法完成”,但这就是Git。 Git会自动执行任何操作,如果您愿意,以后可以轻松进行修复。提交前运行合并--no-commit
和git checkout @ path/to/submodule
,或者如果忘记执行git checkout @~ path/to/submodule
和git commit --amend
。许多自定义工作流可以通过配置设置或挂钩自动实现,但是我认为这很奇怪,如果您想自动化,则必须编写脚本。