如何将Araxis设置为MSYS git的差异/合并工具?

14
我试图将Araxis Merge用作我的MSYSGit的差异/合并工具。
我在网上找到了一些资源:
  • Araxis网站上,他们提到了一种“简单”的方法,但它需要一些可执行文件(araxisgitdiff.exe和araxisgitmerge.exe),这些文件不是我的发行版的一部分。
  • 我也在gitguru上找到了一些关于Araxis的信息,但实际的信息非常有限,我无法从中得出任何结论。
  • 最后,在较旧的stackoverflow帖子上有一些信息,但建议的方法对我不起作用。那个特定的信息是针对OS X的。我尽力将其转换为Windows,但没有成功:

我创建了/bin/git-diff-driver.sh

#!/bin/sh

"/c/Program Files/Araxis/Araxis Merge/compare.exe" -title1:"$1 (repo version)" -title2:"$1 " -max "$2" "$5"

并编辑了gitconfig

[merge]
    tool = araxismerge
[mergetool "araxismerge"]
    cmd = "/c/Program Files/Araxis/Araxis Merge/compare.exe" -3 -merge -wait $LOCAL $BASE $REMOTE $MERGED
[diff]
    external = "/bin/git-diff-driver.sh"

我得到的唯一结果是:

$ git diff HEAD^ HEAD
外部差异出错,停在PowerEditor/src/Notepad_plus.cpp。


编辑:

我也尝试了一个答案建议的exe名称为"c:/Program Files/Araxis/Araxis Merge/compare.exe",但结果相同。


编辑:

我发现如果使用TortoiseGit,可以轻松设置,但它似乎自己处理差异,并且来自TortoiseGit的任何设置都没有指示如何在从命令行调用diff时设置Araxis作为合并工具。


编辑:

所以,问题是:有没有人成功地使用Araxis Merge来与MSYSGit进行差异比较和合并,如果有,你是如何做到的?


刚刚发布了基于difftool和mergetool的新解决方案(不是基于diff.external)。值得一试。 - VonC
刚刚更新了与Araxis compare.exe相关的差异和合并脚本:现在完全可用! - VonC
为您的问题添加了UserVoice条目,以解决无法选择答案的问题:http://stackoverflow.uservoice.com/pages/1722-general/suggestions/232470-bug-unable-to-accept-an-answer-after-an-unresolved-bounty - VonC
你尝试过这个网站上的信息吗?http://www.araxis.com/merge/scm_integration.html#Git 另外,你安装了哪个版本的Araxis Merge?我一直在尝试让它工作,但还没有成功。这里有很多长答案,但仍然没有解决问题。 - Drew Noakes
看来您终于可以选择一个答案了 ;) 请参见http://blog.stackoverflow.com/2010/06/improvements-to-bounty-system/和http://meta.stackexchange.com/questions/1413/why-an-answer-cant-be-accepted-after-an-unresolved-bounty(这个问题最初与您的问题有关)。 - VonC
显示剩余2条评论
8个回答

17
如果你希望始终使用Araxis进行'git diff',可以按照帮助文件中的说明操作。但如果你想像平时一样从命令行使用'git diff',并且使用'git difftool'启动Araxis GUI,则可以尝试将以下内容添加到你的git配置中:
[difftool "araxis"]
    path = "/c/Program Files/Araxis/Araxis Merge/compare.exe"
    renames = true
    trustExitCode = true
[diff]
    tool = araxis
    stat = true
[mergetool "araxismergetool"]
    cmd = 'C:\\Program Files\\Araxis\\Araxis Merge\\araxisgitmerge.exe' "$REMOTE" "$BASE" "$PWD/$LOCAL" "$PWD/$MERGED"
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = araxismergetool
    stat = true

6

5

好的...我明白了,在DOS或Git Bash下,使用msysgit版本1.6.3.2.1299.gee46c和Araxis Merge 2009 v2009.3713的评估许可证,我已经使它工作:

方法是使用新的git difftoolgit mergetool,而不是普通的diff。

首先,让我们为这些diff和merge工具设置一些脚本。

C:\>git config --global diff.tool adifftool
C:\>git config --global diff.external git-difftool--helper
C:\>git config --global difftool.adifftool.cmd "difftool.sh \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
C:\>git config --global difftool.prompt false

注意:

  • 通过将diff.external设置为Git脚本git-difftool--helper,即使我键入“git diff”,我也将使用difftool。
  • 不要忘记将$MERGED传递到您的difftool脚本中:这是唯一带有被diff'ed文件的真实名称的变量。 $LOCAL$REMOTE是临时名称。

对于合并工具,您需要设置以下全局值:

C:\>git config --global merge.tool amergetool
C:\>git config --global mergetool.amergetool.cmd "mergetool.sh \"$PWD/$LOCAL\" \"$PWD/$BASE\" \"$PWD/$REMOTE\" \"$PWD/$MERGED\""
C:\>git config --global mergetool.prompt false

通过将这些工具设置为一些shell脚本,您将能够从这些脚本内部切换工具。
另一种方法是给你的工具命名(mergetool.araxis.cmdmergetool.winmerge.cmd,...),并在diff.toolmerge.tool设置中指定正确的工具。
在一个由全局环境变量PATH引用的目录中创建difftool.shmergetool.sh。它们甚至可以在DOS上运行(它们是sh -- shell -- 脚本)。 difftool.sh
#!/bin/sh
echo Launching Araxis Merge.exe: $3
t1="'$3 (from)'"
t2="'(to)'"
"C:/Program Files/Araxis/Araxis Merge/Compare.exe" -max -nowait -2 -title1:${t1} -title2:${t2} "$1" "$2" 

注:

  • 不可能有-title1:“someTitle With Space”...只有没有空格的标题才能工作......所以现在,尝试不使用任何 'titleN' 选项。
    明白了!您不能直接将标题值传递给 -title 选项,您需要将其设置为本地变量,并使用 "' '" 引号组合(双引号将在 shell 脚本执行期间消失,留下单引号,允许标题中包含空格!)
  • $3 表示真实名称而不是某些用于 diff 目的的临时文件名。因此,在其中使用 $3title1 选项,其中包含空格。
  • git diff HEAD^ HEAD 在 DOS 会话中无法工作:只有 git diff "HEAD^" HEAD 才可以。

mergetool.sh

#!/bin/sh

# Passing the following parameters to mergetool:
#  local base remote merge_result

alocal=$1
base=$2
remote=$3
result=$4

t1="'$4 (current branch)'"
t2="'(common ancestor)'"
t3="'(to be merged)'"

if [ -f $base ]
then
    "C:/Program Files/Araxis/Araxis Merge/Compare.exe" -max -wait -merge -3 -a2 -title1:${t1} -title2:${t2} -title3:${t3} "$alocal" "$base" "$remote" "$result" 
else
    "C:/Program Files/Araxis/Araxis Merge/Compare.exe" -max -wait -merge -3 -a2 -title1:${t1} -title2:${t2} -title3:${t3} "$alocal" "$result" "$remote" "$result" 
fi

我不确定当涉及到多个文件时(多个差异,多个要合并的文件)这些脚本是否能正常工作。
刚刚测试了一下:它可以工作,而且Araxis compare.exe会为每个文件打开一个选项卡以进行差异比较或合并。
试试看,然后告诉我们吧 ;)


1
我不得不在$LOCAL等变量前加上反斜杠('')。这样它就能工作了。 - Mike Caron
@Mike:感谢您的反馈。当您需要为“git config”参数转义那些$符号时,您是在DOS会话还是bash shell会话中? - VonC
Thell 刚刚提供了一个更简洁的答案。 - joce

2

我认为在.gitconfig文件中,你需要更加小心地转义。

不幸的是,由于配置变量的扩展和执行方式,你的字符串需要成为一个有效的 shell 命令,并且要经过 'git config' 转义。

尝试像这样做:

[mergetool "araxismerge"]
    cmd = \"/c/Program Files/Araxis/Araxis Merge/compare.exe\" -3 -merge -wait \"$LOCAL\" \"$BASE\" \"$REMOTE\" \"$MERGED\"

是的,我知道这并不美观。这是其中一个情况,直接使用 git config 实际上更容易。

git config --global mergetool.araxismerge.cmd '"/c/Program Files/Araxis/Araxis Merge/compare.exe" -3 -merge -wait "$LOCAL" "$BASE" "$REMOTE" "$MERGED"'

那是关于合并的,但是差异呢?你也可以用 git config --global 来设置它吗? - joce

1

我曾经为这个问题苦恼了很长时间,现在我终于可以说,所有建议的肮脏 hack(如中间 shell 脚本)都是不必要的 =D。事实是,所有最新版本的 MSYSGit(我有 1.6.4 版)都原生支持 Araxis Merge(我有 2008 版)。毫不奇怪,内部称之为 "araxis"。所以,你需要做的就是设置

[merge]
    tool = araxis

在你的.gitconfig中,你还需要将Araxis文件夹包含到你的PATH环境变量中(MSYSGit会寻找Compare.exe)。

为了保险起见,与"araxis"合并工具相关的其他Git设置,如果你已经配置过(特别是如果你像本页上的一些人一样选择了这个名字),都应该被删除。这包括[mergetool "araxis"]部分下的所有内容。确保从所有配置文件(系统、全局和仓库)中删除它们,否则它们可能会干扰正常的"内部工具"行为。

无论如何,如果你想知道MSYSGit如何启动你的Araxis Merge,或者想知道它支持哪些其他合并工具,可以查看MSYSGit安装文件夹中的\share\git-gui\lib\mergetool.tcl脚本。

PS. 你可以通过在.gitconfig中配置mergetool.araxis.path来避免设置PATH环境变量。个人而言,我从来没有费心去做这件事,因为

  1. 我总是从命令行中使用Araxis Merge。
  2. .gitconfig中指定目录路径(特别是像"C:\Program Files\Araxis\Araxis Merge\"这样包含空格的路径)可能很难正确完成,因为它容易受到反斜杠/正斜杠问题的影响,这些问题困扰着MSYSGit。

附:以上所有内容也适用于将Araxis设置为您的差异工具。也就是说,您需要添加

[diff]
    tool = araxis

如果您的配置文件中有[difftool "araxis"]部分,请删除其中的所有内容(不要忘记设置PATH)。


谢谢!一旦我更新到最新的git,我会尝试一下。 - joce
希望这能有所帮助。但我不确定你是否需要等待 - 至少你可以检查一下,在你的\share\git-gui\lib\mergetool.tcl中是否存在单词"araxis"(不使用引号)。只需用记事本打开 .tcl 文件并使用文本搜索即可。单词的存在是当前 MSYSGit 已经支持 Araxis 的明确指示。假如 1)以上条件成立,2)你没有配置名为“araxis”的自定义合并工具,3)在 PATH 中提到了 Araxis 文件夹,则可以通过调用“git mergetool --tool=araxis”而无需进行任何其他配置来尝试它。 - nightingale
你的树中应该有一个未解决的合并冲突,这样“git mergetool”才能对该工具做出明智的反应。否则,Git不会感到需要检查工具的存在等。 - nightingale
抱歉,我回复你太晚了,Drew,但我希望这能对下一个人有所帮助。在这种情况下,基本思路是Git知道“araxis”合并工具,即它有一些关于它的配置,例如需要调用的可执行文件名为“compare”。但它无法找到可执行文件本身。最简单的修正方法是将Araxis的路径(例如“C:\ Program Files \ Araxis \ Araxis Merge \”)添加到PATH环境变量中。当然,如上所述,在.gitconfig中明确指定合并工具的路径也应该有所帮助。 - nightingale
如果出现某些问题,例如您确信已正确设置了PATH并从.gitconfigs中删除了所有mergetool部分的残留物,但仍无法解决问题,那么我也没有更多的想法。您可以尝试将Araxis的Compare.exe(通常的名称)重命名为全小写(“compare.exe”),以防git(最初是为Linux设计的,因此是区分大小写的实用程序)有所挑剔。但老实说,我非常怀疑这种情况。 - nightingale
显示剩余2条评论

0
你可以尝试按照我在关于DiffMerge的答案中提到的脚本(适用于Windows)来操作,看看是否有效。
可执行路径可以更好地表达为:
#!/bin/sh

"C:/Program Files/Araxis/Araxis Merge/compare.exe" -title1:"$1 (repo version)" -title2:"$1 " -max "$2" "$5"

很遗憾,我得到了相同的结果。:-( $ git diff HEAD^ HEAD 外部差异已经停止,停留在PowerEditor/src/Notepad_plus.cpp。 - joce

0

由于我一直被自定义的git差异/合并所困扰,我想我会尝试一次性解决这个问题。我已经到了AraxisMerge开始的地步,但是没有选项卡的标题。所以这将留给读者作为练习 :)

观察和评论:

  • 我没有AraxisMerge,所以我下载了它,并获得了一个免费的30天评估许可证来尝试它。这个版本(似乎是7.0)带有araxisgitdiff.exe,你发送的带有说明的链接有效。所以这将是选项#1:升级Araxis Merge。
  • 由于我是从CMD.EXE工作的,'git diff HEAD HEAD^'不起作用。'^'需要转义为'git diff HEAD "HEAD^"'。
  • 对于我的工作,我使用kdiff3作为Windows上的免费替代品,它运行得相当不错(它默认受到git的支持)

从git-diff-driver.sh开始,我遇到了同样的错误。在将脚本更改为仅包含'echo'后,这并没有改变。因此,错误与脚本内容无关。

然后我从.gitconfig中删除了'/bin'部分,所以该行变成

external = "git-diff-driver.sh"

...然后它开始工作了:它启动了合并,但是它没有正确地转义 '(repo) ' 部分。为了解决这个问题,我使用以下方法使其在没有标题的情况下工作:

#!/bin/sh
"/c/Program Files/Araxis/Araxis Merge/compare.exe" -max "$2" "$5"

祝你好运!


我有一些针对Araxis工作的差异和合并脚本,发布在我的SO问题答案中。你能否检查它们并告诉我它们是否适用于你? - VonC

0

我发现一个“简单”的方法是安装TortoiseGit并在TortoiseGit选项中设置差异/合并工具。
但是,如果您想从命令行进行差异处理,则无法解决此问题。


这意味着TortoiseGit已成功将该设置转换为系统或全局Git属性,是吗?现在'git config --global --list'或'git config --list'返回什么? - VonC
看起来TortoiseGit没有设置任何东西:http://npp.pastebin.com/f65b60a49 奇怪。我想知道它是如何做到的。 - joce
我的问题也是这个。也许是一个环境变量? - VonC
嗯。在我的 .git 目录中有一个 tortoisegit.data 和一个 tortoisegit.index 文件。但它们是二进制的,似乎没有以纯文本形式包含任何与 Araxis 相关的参考。 - joce
哈!它存储在HKEY_USERS{some-UUID}\Software\TortoiseGit中。但我猜这并不能让我更接近让git从命令行使用Araxis。 - joce

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