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

我有我的(networking)应用程序的主人和testing分支。 这些项目几乎是相同的,除了一个文件设置应用程序,说“设置”。

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

我遵循专业书(http://progit.org/book/pt-br/ch7-2.html)的指导,创build了一个.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 

预期的结果:设置包含单词“主”,而不是git执行ff合并和设置是“testing”。)

我有同样的错误,只需在.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=ours .gitattributes 。 在这之后,这两个文件总是在两个分支上不同,所以合并驱动程序将始终被调用,所以我不需要具有触摸该文件的自定义合并驱动程序。 只有在最初修改时才是必要的。

合并驱动程序只在非平凡的情况下被调用,也就是说,如果主控和testing都已经触及设置(您需要首先定义合并驱动程序):

 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 

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

有一个污迹干净的脚本,而不是单独的分支机构。 脚本可以根据你在什么机器而不同。