我有一个主人和我的(网络)应用程序的测试分支.这些项目几乎相同,只有一个设置应用程序的文件,比如说"setup".
每当我将一个分支合并到另一个分支时,我希望该分支保持其版本的设置.也就是说,git不应该尝试将更改合并到该文件.
我按照Pro Git书中的指导创建了一个.gitattributes文件,其中包含"setup merge = ours"行.但是,这不起作用 - 如果我引入冲突,也不能快速合并.
(确切地说:
$: mkdir gitest
$: cd gittest
$: git init
$: echo "setup merge=ours" >> .gitattributes
$: echo "master" >> setup
$: git add setup .gitattributes
$: git commit -a -m ...
$: git branch test
$: git checkout test
$: echo "test" >> setup
$: git commit -a -m ...
$: git checkout master
$: git merge test
Run Code Online (Sandbox Code Playgroud)
预期结果:setup包含单词"master",而git执行ff merge并且setup是"test".)
Jor*_*ona 21
我有同样的错误,只需在.git/config中定义一个"我们的"合并驱动程序即可解决:
[merge "ours"]
name = "Keep ours merge"
driver = true
Run Code Online (Sandbox Code Playgroud)
由于true始终返回0,因此保持当前状态的临时文件不会更改,并将保留为最终版本.
您可以在此处阅读有关合并驱动程序的更多信息:http://www.kernel.org/pub/software/scm/git/docs/gitattributes.html#_defining_a_custom_merge_driver
附录:
这在驱动程序实际被调用的任何时候都有效,并且这似乎只在提交更改相同文件时发生(git merge属性).如果单个分支中有更改,则不会调用驱动程序.
我发现,如果我修改了两个分支上的文件并将修改提交到每个分支,然后尝试合并,它将调用合并驱动程序并监听我.gitattributes
指定的内容merge=ours
.在此之后,两个分支上的两个文件总是不同,因此将始终调用合并驱动程序,因此我不需要具有触及该文件的自定义合并驱动程序.只需要最初修改两者.
仅在非平凡的情况下才调用合并驱动程序,即,如果主设备和测试都已触及设置(并且您需要先定义合并驱动程序ours
):
git init
git config merge.ours.name '"always keep ours" merge driver'
git config merge.ours.driver 'touch %A'
echo "setup merge=ours" >> .gitattributes
echo "master" >> setup
git add setup .gitattributes
git commit -a -m ...
git branch test
git checkout test
echo "test" >> setup
git commit -a -m ...
git checkout master
echo "more content" >> setup
git commit -a -m ...
git merge test
Run Code Online (Sandbox Code Playgroud)
话虽如此,我想知道是否在存储库中进行设置是否明智。如果您确实希望它在版本控制下,则可以使用子模块或子树合并策略来使公用文件保持同步。