首页 文章

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

提问于
浏览
16

我有一个主人和我的(网络)应用程序的测试分支 . 这些项目几乎相同,只有一个设置应用程序的文件,比如说“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 回答

  • 7

    我有同样的错误,只需在.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

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

  • 19

    合并驱动程序仅在非平凡情况下调用,即如果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
    

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

  • 4

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

相关问题