如何在Git中为特定文件扩展名设置差异/合并工具?

12

能否在Git中设置自定义工具合并特定扩展名的文件?

非常感谢任何指导!

更新

我没有想到比定义自定义差异工具并像@jarodeells建议的那样手动调用它更好的解决方案:

[diff]
    tool = mydiff
[difftool "mydiff"]
    cmd="script.sh \"$LOCAL\" \"$REMOTE\""

然后显式调用它:

$ git difftool -t mydiff someFileWith.ext

请问您能否更具体地说明解决方案?另外,我认为命令行末尾多了一个引号。 - Halil
实际上,在 script.sh 后面有一个额外的 ",这是不必要的。现在应该没问题了 :-) - rlegendi
我尝试了你提出的解决方案,但是当我执行 git difftool --cached 命令时,脚本无法捕捉到该选项并且无法工作。你遇到过这个问题吗? - Halil
2个回答

6
更新:请查看下面 @Ackdari 的评论。外部工具不一定是基于命令行的。当使用外部工具时,我不确定 git 如何使用 “binary = True”,但我怀疑所有流程都需要它才能正常工作。
如果你的外部比较工具*只支持命令行(没有 GUI),则可以使用内置的 gitattributes 进行设置:
.gitconfig 中添加以下内容:
[diff "my_diff"]
    command = Tools/csv_diff
    binary = true # Not sure this is required.

.gitattributes 文件中(可以是全局的或者每个仓库的,参见这里),添加以下内容:

*.csv diff=my_diff

[*] 外部差异工具的命令将由git使用在手册这里详细介绍的7个参数调用。请注意保留GITE_EXTERNAL_DIFF中的html标签。

你的评论让我有点摸不着头脑 :-). Git 在“diff”部分定义的“diff driver”和在“difftool”部分定义的“diff tool”之间有一些区别,我记得读过一个驱动程序必须是基于文本的,但现在手册上没有看到。所以请尝试一下,也许会起作用!如果可以,请发表评论,我会更新答案。另外,我之前不知道的另一件事是,在驱动程序定义中添加binary = true选项(就在command = Tools/csv_diff下面)。也许这就是需要的更改。 - OmerB
已测试并且可以正常运行(编写了一个程序,仅显示cli参数和二进制文件.jpg),但是对我来说 binary = true 不是必需的。但我仍然好奇为什么我不能像 merge.<driver>.driver 那样修改cli参数的提供方式(请参阅文档)。 - Ackdari
@Ackdari 不错!我想知道的一件事是,当git需要显示文本差异并定义了GUI工具时会发生什么(例如,当您回溯几个提交并执行git log -p时)... - OmerB
在我的设置中,Git 只显示 Binary files /dev/null and b/bild.jpg differ - Ackdari
好的,这是git通常显示二进制文件的方式,所以我猜想它在某个地方被检测为二进制。 - OmerB
谢谢!我只需要进行一个额外的更改来设置我的默认属性文件:git config --global core.attributesfile /home/alex/.gitattributes。请注意,如果您只想在一个存储库中使用它,则需要写入.git/info/attributes(至少在Linux git上)。 - Alex Zeffertt

2
如果尚未支持,请安装一个Shell脚本,该脚本基于扩展名并调用正确的合并工具。

2
是的,那可能是一个解决方案,但我想避免定制解决方案。我想知道是否可以通过 gitconfig 实现(如标签所示)。 - rlegendi

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