.gitattributes和文件的个别合并策略

Ian*_*Ian 17 git

我有一个主人和我的(网络)应用程序的测试分支.这些项目几乎相同,只有一个设置应用程序的文件,比如说"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属性).如果单个分支中有更改,则不会调用驱动程序.

  • @VitalyB我尝试了几种方法,但只有两个分支都有变化才有效.至少发生一次冲突,然后调用合并策略.从那时起,对于所有冲突和更改(包括可用的冲突和更改),将调用合并策略并且不会影响目标文件.请参阅下面的凯文答案 (4认同)

Kev*_*hey 7

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

  • 我认为这是因为git处理*文件*的更改,而不是*文件本身*.举个例子:假设你有一个分支.现在你做一个"测试"分支,并在每个指定你的"config.php merge = ours"中添加.gitattributes文件(当然要确保设置`git config merge.ours.driver = true`).现在让我们说创建新分支后,对config.php进行一些"测试"更改,然后查看"master"并将"test"合并到其中.会发生什么,"test"对config.php进行了更改,但master没有,所以没有"我们的",因为"我们"没有任何变化! (2认同)

Uwe*_*nig 5

仅在非平凡的情况下才调用合并驱动程序,即,如果主设备和测试都已触及设置(并且您需要先定义合并驱动程序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)

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


Ada*_*ruk 1

有一个污迹干净的脚本而不是单独的分支。该脚本可能会有所不同,具体取决于您所在的机器。