git:如何添加自定义合并策略?

21

我试图添加一种类似于这个问题中的自定义合并策略:Git合并冲突总是选择最新文件

我将脚本保存为git-merge-latest.sh,并在.git/config中添加了以下内容:

[merge "latest"]
    name = select latest file merge driver
    driver = git-merge-latest.sh %O %A %B

然而,当我运行 git pull --strategy latest 命令时,我收到以下提示信息:

Could not find merge strategy 'latest'.
Available strategies are: octopus ours recursive resolve subtree.

我已经尝试检查git config merge.latest.driver,它返回了预期的输出。我还将 driver 的值更改为 true,只是为了验证它不是找不到脚本的问题。

这在运行 git 1.8.2.2 和 1.7.9.5 的两个不同系统上发生。我做错了什么?

1个回答

34
在这种情况下,你没有配置合并策略(merge strategy),而是配置了合并驱动(merge driver):
合并策略是一种程序,用于确定如何合并两个或多个提交(commits)。默认情况下,git merge使用“递归”策略,在git-merge-recursive程序中找到。通过向git merge(或git pull)指定--strategy <strategy>标志,告诉它调用不同的策略。如果要插入自己的合并策略,则可以通过在路径中创建可执行文件git-merge-mystrategy并运行git merge --strategy mystrategy来实现。
这与合并驱动(merge driver)不同。合并驱动是解决在合并两个提交时存在的文件冲突的机制。您可以按照您概述的方式配置自己的合并驱动程序,即通过配置merge.mydriver.driver设置。
要为特定文件启用合并驱动程序,需要在.gitattributes中为该文件配置驱动程序。
filename merge=mydriver

可能需要明确说明,添加合并策略是修改 git 代码的问题 - 目前无法通过配置更改来完成此操作... - twalberg
2
@twalberg - 实际上,你可以很容易地插入自己的内容;如果你的路径中有一个 git-merge-xyz,那么当你运行 git merge --strategy xyz 时,git 将会运行它。我会在我的回答中更清楚地表述。 - Edward Thomson
15
如何编写 git 合并策略的规范是否有可执行文档?我应该期望什么样的标准输入和输出? - Asad Saeeduddin
有没有一种方法可以为某些文件设置默认策略? - DylanYoung
@AsadSaeeduddin 从答案中的链接(https://git-scm.com/docs/gitattributes#_defining_a_custom_merge_driver)中可以看到:“合并驱动程序应该通过覆盖名为%A的文件来保存合并的结果,并且如果成功地进行了干净的合并,则退出时返回零状态,如果存在冲突则返回非零值。”您可以通过百分比变量替换来指定传递给可执行文件的参数。 - Anton Strogonoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接