在OS X上使用git和DiffMerge出现问题

8

我已经按照以下说明配置了Sourcegear DiffMerge作为我的默认git合并工具:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd "diffmerge \"\$LOCAL\" \"\$REMOTE\""

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd "diffmerge --merge --result=\"\$MERGED\"
\"\$LOCAL\" \"\$BASE\" \"\$REMOTE\""
git config --global mergetool.diffmerge.trustexitcode false

来源:http://www.andrejkoelewijn.com/wp/2010/01/08/configure-diffmerge-with-git/

然而,当我运行git mergetool时,我收到以下错误:

DiffMerge Error

这个问题的原因是什么?


有一个中间脚本会有帮助吗?例如 https://dev59.com/7VDTa4cB1Zd3GeqPLK11#4314057 - VonC
你能否在终端中运行diffmerge命令而不使用git? - brycemcd
1
我看到了同样的事情。在本地文件系统中,BASE文件不存在,但是diffmerge命令行中引用的其他文件(在您的情况下,10new.xml.REMOTE.2128.xml和10new.xml.LOCAL.2128.xml)确实存在。这可能与DiffMerge对Git行为(可能是Git版本行为)的期望有关。 - Chris Burgess
我无法重现这个问题,你使用的Git和DiffMerge版本是什么? 我的git版本是1.7.3.4,DiffMerge是3.3.0(1001)。 - catsby
1个回答

8

如果两个要合并的文件没有共同的祖先,或者在应用或重建补丁时发生冲突而不是合并分支,则可能不存在$BASE文件。在这种情况下,虽然$BASE变量仍将被设置,但那里将没有文件。

在您的mergetool命令中,您需要检查$BASE是否存在,如果不存在,则进行没有共同祖先的合并。看起来DiffMerge不支持该模式(它支持合并没有共同祖先的两个文件,但它总是将输出写入其中一个文件,而不是结果文件)。相反,如果不存在$BASE,则需要将$LOCAL作为$BASE文件传递:

git config --global mergetool.diffmerge.cmd 'diffmerge --merge --result="$MERGED" "$LOCAL" "$(if test -f "$BASE"; then echo "$BASE"; else echo "$LOCAL"; fi)" "$REMOTE"'

哇,太棒了,看起来唯一的选择就是使用付费的Git合并工具。非常好用,谢谢。 - Amala
2
太棒了,Brian的建议非常有用!我已经将它整合到我的Git/DiffMerge设置HOWTO中:http://twobitlabs.com/2011/08/install-diffmerge-git-mac-os-x/ - ToddH

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