.gitattributes&文件的单独合并策略

时间:2011-03-28 21:09:47

标签: git

我有一个主人和我的(网络)应用程序的测试分支。这些项目几乎相同,只有一个设置应用程序的文件,比如说“setup”。

每当我将一个分支合并到另一个分支时,我希望该分支保持其设置版本。也就是说,git不应该尝试将更改合并到该文件中。

我按照guidance from the Pro Git book创建了一个.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

预期结果:setup包含单词“master”,而git执行ff merge并且setup是“test”。)

4 个答案:

答案 0 :(得分:19)

我遇到了同样的错误,只需在.git / config中定义“我们的”合并驱动程序即可解决:

[merge "ours"]
    name = "Keep ours merge"
    driver = true

由于true始终返回0,因此保持当前状态的临时文件不会更改,并将保留为最终版本。

您可以在此处详细了解合并驱动程序:http://www.kernel.org/pub/software/scm/git/docs/gitattributes.html#_defining_a_custom_merge_driver

附录:

只要有提交更改相同文件(git merge属性),这似乎就会发生。如果单个分支中有更改,则不会调用驱动程序。

答案 1 :(得分:7)

我发现如果我修改了两个分支上的文件并将修改提交到每个分支,然后尝试合并,它将调用合并驱动程序并收听指定.gitattributes的{​​{1}} 。在此之后,两个分支上的两个文件总是不同,因此将始终调用合并驱动程序,因此我不需要具有触及该文件的自定义合并驱动程序。只需要最初修改两者。

答案 2 :(得分:4)

合并驱动程序仅在非平凡情况下调用,即如果master和test都触及设置(并且您需要首先定义合并驱动程序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

话虽如此,我想知道在存储库中设置是否合理是明智的。如果您真的希望它在版本控制下,您可以使用子模块或子树合并策略来保持公共文件同步。

答案 3 :(得分:1)

涂抹干净的脚本而不是单独的分支。根据您所使用的机器,脚本可能会有所不同。