14

我正在尝试使用Araxis Merge作为 MSYSGit 的差异/合并工具。

我在网上找到了一些资源:

  • Araxis 站点上,他们提到了一种“简单”的方式,但它暗示了不属于我的发行版的可执行文件(araxisgitdiff.exe 和 araxisgitmerge.exe)。
  • 我还在gitguru中找到了一些信息,但实际信息 re: 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
external diff 死了,停在 PowerEditor/src/Notepad_plus.cpp。


编辑:

我也尝试过使用"c:/Program Files/Araxis/Araxis Merge/compare.exe"答案之一所建议的exe命名,结果相同。


编辑:

我发现如果你使用 TortoiseGit 可以很容易地设置它,但它似乎可以自己处理 diff,并且 TortoiseGit 中的任何设置都没有说明如何在从命令行调用 diff 时将 Araxis 设置为合并工具。


编辑:

所以,问题是:有没有人成功地使用 Araxis Merge 来区分和合并 MSYSGit 的东西,如果有,你是怎么做到的?

4

8 回答 8

16

如果你想让 'git diff' 始终使用 araxis,你可以使用帮助文件中的说明,但是如果你想像通常从命令行和 'git difftool' 一样控制使用 'git diff' Araxis 图形用户界面。

尝试将以下内容添加到您的 git config::

[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
于 2009-09-15T22:11:04.110 回答
6

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

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

于 2010-12-03T10:34:13.853 回答
5

对...我在 DOS 或 Git Bash 下使用 msysgit 版本 1.6.3.2.1299.gee46c 使用 Araxis Merge 2009 的评估许可证 v2009.3713:

方法是使用新的git difftooland git mergetool,而不是普通的差异。

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

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 文件真实名称的变量。$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.cmd, mergetool.winmerge.cmd, ...) 并在diff.toolormerge.tool设置中指定正确的工具。

在全局环境变量引用的目录中创建difftool.sh和。它们甚至可以在 DOS 下工作(它们是-- shell -- 脚本)mergetool.shPATHsh

差异工具.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代表真实名称,而不是一些用于差异目的的临时文件名。因此,$3title1选项中使用了其中的空格。
  • git diff HEAD^ HEAD不会在 DOS 会话中工作:只会git diff "HEAD^" HEAD

合并工具.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 确实为每个文件打开一个选项卡以进行比较或合并。
试一试,让我们知道;)

于 2009-06-19T09:13:28.407 回答
2

我认为您需要在 .gitconfig 中转义时更加小心。

不幸的是,由于 config 变量被扩展和评估的方式,你的字符串需要是一个有效的 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"'
于 2009-05-05T17:55:32.973 回答
1

我为这个问题苦苦挣扎了很长一段时间,现在我终于可以说,所有建议的肮脏黑客(如中间 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 感兴趣,或者想知道它支持哪些其他开箱即用的合并工具,则可以查看\share\git-gui\lib\mergetool.tclMSYSGit 安装文件夹中的脚本。

PS。您可以通过配置mergetool.araxis.pathin来避免设置 PATH 环境变量.gitconfig。就个人而言,我从不费心这样做,因为

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

聚苯乙烯。以上所有内容也适用于使 Araxis 成为您的差异工具。即,您需要添加

[diff]
    tool = araxis

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

于 2009-11-02T10:31:52.260 回答
0

您可以尝试按照我关于 diffMerge(适用于 Windows)的回答中提到的脚本,看看它是否有效。

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

#!/bin/sh

"C:/Program Files/Araxis/Araxis Merge/compare.exe" -title1:"$1 (repo version)" -title2:"$1 " -max "$2" "$5"
于 2009-05-05T15:53:44.640 回答
0

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

于 2009-05-05T21:34:21.870 回答
0

由于我一直被定制的 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"

...这开始起作用了:它开始了合并,但它没有正确地逃避 '(repo) ' 部分。作为一种解决方法,我让它在没有标题的情况下工作:

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

祝你好运!

于 2009-06-13T20:43:42.560 回答