2010-12-14 64 views
8

我已经配置Sourcegear DiffMerge使用下面的说明是我的默认的git合并工具:问题的混帐+ DiffMerge在OS X

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

可能是什么这个问题的原因是什么?

+0

将具有中间脚本帮助?正如在http://stackoverflow.com/questions/3780420/is-it-possible-to-use-winmerge-to-view-git-diffs-from-cygwin/4314057#4314057 – VonC 2010-12-14 13:39:08

+0

你能够运行diffmerge命令在使用git的终端之外? – brycemcd 2010-12-14 16:04:10

+1

我看到同样的事情。 BASE文件不存在于本地文件系统中,但diffmerge命令行中引用的其他文件(在本例中为10new.xml.REMOTE.2128.xml和10new.xml.LOCAL.2128.xml)确实存在。 DiffMerge对Git行为的期望(可能是Git版本行为)的问题? – 2010-12-19 23:39:30

回答

8

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

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

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

哇真棒,看起来像唯一的其他选择是使用付费的Git mergetools。很好,谢谢。 – Amala 2011-04-29 17:49:56

+2

真棒提示布赖恩!我已经将它合并到我的Git/DiffMerge设置HOWTO:http://twobitlabs.com/2011/08/install-diffmerge-git-mac-os-x/ – ToddH 2011-08-18 19:57:03

+0

@HamishGrubijan啊,谢谢。 – 2013-03-12 19:02:41