如何将Araxis设置为MSYS git的diff / merge工具?

我试图使用Araxis合并作为我的MSYSGit的差异/合并工具。

我在网上find了一些资源:

  • 在Araxis网站上 ,他们提到了一个“简单”的方法,但是这意味着一个不属于我的发行版的可执行文件(araxisgitdiff.exe和araxisgitmerge.exe)。
  • 我也在gitguru中find了一些信息,但是实际的信息是:Araxis最好是稀疏的,而且我什么也做不了。
  • 最后,有一些旧的计算器上的信息 ,但build议的方法不适合我。 这个特定的信息是面向OS X.我尽我所能“翻译”到Windows,但没有成功:

我创build了/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。


编辑:

我也尝试了一个名为"c:/Program Files/Araxis/Araxis Merge/compare.exe"的exe "c:/Program Files/Araxis/Araxis Merge/compare.exe" ,其结果如下。


编辑:

我发现如果使用TortoiseGit,可以很容易地设置它,但似乎是自行处理差异,并且从命令行调用diff时,没有任何来自TortoiseGit的设置给出了关于如何将Araxis设置为合并工具的任何指示。


编辑:

所以,问题是:有没有人成功使用Araxis Merge来与MSYSGit进行区分和合并,如果是这样的话,你是怎么做的?

如果你想让'git diff'总是使用araxis,你可以使用帮助文件中的指令,但是如果你想要控制使用'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 

araxis上的文档已更新: http : //www.araxis.com/merge/documentation-windows/integrating-with-other-applications#Git

我可以使用在那里显示的配置,无需任何修改。

正确的…我得到它的工作,与msysgit版本1.6.3.2.1299.gee46c,在DOS或Git Bash,与Araxis合并2009年,v2009.3713评估许可证:

方法是使用新的git difftoolgit mergetool ,而不是简单的diff。

首先,我们为这些差异和合并工具设置一些脚本

 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 MERGED传递给difftool脚本:这是唯一一个文件真实名称被区分的变量。 $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.tooldiff.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选项,你需要把它设置为一个局部变量,用"' '" quotes组合(双引号将在shell脚本执行过程中消失,留下简单的引号,一个标题!)
  • $3代表真实的名称,而不是一些临时的文件名,用于比较目的。 因此,在title1选项中使用$3 ,其中有空格。
  • 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确实打开每个文件的一个选项卡进行比较或合并。
试试看,让我们知道;)

我认为你需要在你的.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"' 

你可以试着按照我在关于diffMerge (对于Windows)的回答中提到的脚本 ,看看它是否有效。

可执行路径可以更好地表达为:

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

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

由于我一直被咬到定制git的不同/合并,我想我会试图修复这一个一劳永逸。 我达到了AraxisMerge开始的地步,但没有标签的标题。 所以这将留给读者作为练习:)

意见和评论:

  • 我没有AraxisMerge,所以我下载了它,并得到一个免费的30天的评估许可证试用。 这个版本(似乎是7.0)带有araxisgitdiff.exe,并且链接了你发送的指令。 所以这将是选项#1:升级araxis合并。
  • 由于我正在从CMD.EXE工作,“git diff HEAD HEAD ^”不起作用。 '^'需要转义为'git diff HEAD'HEAD ^“'。
  • 对于我自己的工作,我使用kdiff3作为Windows上的免费替代品,它工作得相当好(这有助于它被git默认支持)

从git-diff-driver.sh开始,给了我同样的错误。 在将脚本更改为仅包含“回显”后,这并没有改变。 所以错误是独立于脚本的内容。

然后,我从.gitconfig中删除了“/ bin”部分,所以这一行变成了

 external = "git-diff-driver.sh" 

…这开始工作:它开始合并,但它不正确地逃避“(回购)”的一部分。 作为一个解决方法,我得到了它的工作没有标题:

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

祝你好运!

我在这个问题上苦苦挣扎了好一会儿,现在我终于可以说,所有建议的肮脏的黑客(比如中间shell脚本)都是不必要的= D。 事情是,所有的最新版本的MSYSGit(我有1.6.4)支持Araxis合并(我有2008)开箱即用。 毫不奇怪,在内部它被称为“araxis”。 所以,你需要的就是设置

 [merge] tool = araxis 

在你的.gitconfig 此外,您必须包括Araxis文件夹到您的PATH环境变量(MSYSGit查找Compare.exe )。

对于一个好的措施,其他与“araxis”mergetool有关的Git设置,你可以配置(特别是如果你恰好选择了这个名字,就像本页上的一些人一样),都应该被删除。 这包括[mergetool "araxis"]部分下的所有内容。 确保从所有配置(系统,全局和存储库)中删除它们,否则,它们可能会干扰正常的“内部工具”行为。

无论如何,如果您对MSYSGit将如何启动您的Araxis Merge感兴趣,或者想知道它支持的其他合并工具是什么,那么在您的位置查看\share\git-gui\lib\mergetool.tcl脚本MSYSGit安装文件夹。

PS。 您可以通过在.gitconfig配置mergetool.araxis.path来避免设置PATH环境变量。 就我个人而言,我从来没有打扰过这样做

  1. 无论如何,我都是从命令行使用Araxis Merge。
  2. .gitconfig指定目录路径(尤其是像"C:\Program Files\Araxis\Araxis Merge\" ,其中包含空格)的目录路径可能难以正确完成,因为它容易出现反斜杠/转发问题,困扰MSYSGit 。

PPS。 以上所有内容都适用于使Araxis成为你的差异化工具。 即,你需要添加

 [diff] tool = araxis 

并删除[difftool "araxis"]部分中的任何其他内容,如果您的配置中有它(不要忘记设置PATH,虽然)。