Ediff作为git difftool

7
我正在尝试将emacs ediff用作git difftool。
我已经按照这里提出的一些配置进行了设置: 使用ediff作为git mergetool 当比较某个文件的不同git修订版本时,我完全没有问题:ediff工作正常,并且两个版本之间的差异被正确地描述。
然而,当我尝试运行git difftool来比较文件的当前目录版本与某个git修订版本时,我遇到了问题。 对于某些文件,我会收到以下错误:
apply: Wrong type argument: arrayp, nil
这很奇怪,因为这个错误只针对某些文件,而不是所有文件。
我已经尝试过几个文件,我认为经验法则如下: - 如果要比较的文件不放在git根目录中,则失败。 - 否则,ediff会毫无问题地显示文件的当前版本和指定修订版本之间的差异。

我尝试了上面提到的一些配置,但它们都给了我同样的结果:当比较非根git文件的当前目录版本和某个git修订版本时,git difftool会失败。

有什么想法可以解决这个问题吗?

非常感谢。 -Bob


嗯,我知道meld,但我更喜欢ediff,因为它是我的工作流的一部分。我还在emacs中使用magit,它运行得非常完美。但有时候我想立即启动一个差异,而不必进入magit,这就是我需要ediff的原因。 - Bob V
1个回答

10
Git 知道许多标准的差异/合并工具,包括 ediff/emerge。请尝试。
git config --global diff.tool ediff

并使用以下方式调用它

git difftool --tool=ediffclient master -- <file>

或类似的工具。 ediffclient 将使用 emacsclient 而不是启动新的 Emacs,这是我更喜欢的方式,但可能因人而异。

编辑(回应评论):如果 Git 抱怨 edifftool,请尝试将以下内容添加到您的全局 Git 配置文件($HOME/.gitconfig)中:

[difftool "ediff"]
          cmd = emacs --eval \"(ediff-files \\\"$LOCAL\\\" \\\"$REMOTE\\\")\"
[difftool "ediffclient"]
          cmd = emacsclient --eval \"(ediff-files \\\"$LOCAL\\\" \\\"$REMOTE\\\")\"

我以为这些设置是安装的一部分,但也许我错了(或者在较新版本的git中可能会更改)。找到时间后,我将尝试深入挖掘。

谢谢。我已经尝试了您所说的,它运行良好。问候 - Bob V
抱歉,我完全忘记了...谢谢。 - Bob V
Unknown merge tool ediffclient fatal: external diff died, stopping - Christoph90
@Christoph90:请告诉我这个编辑是否有帮助 - 谢谢! - NickD
是的,将这些行包含在.gitconfig中使它对我起作用了。之前的配置只有我的姓名、电子邮件和ediff作为差异工具集。谢谢。 - Christoph90

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