【问题标题】:How to set Araxis as diff / merge tool for MSYS git?如何将 Araxis 设置为 MSYS git 的差异/合并工具?
【发布时间】:2010-10-23 22:52:26
【问题描述】:

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

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

  • Araxis site 上,他们提到了一种“简单”的方式,但它暗示了不属于我的发行版的可执行文件(araxisgitdiff.exe 和 araxisgitmerge.exe)。
  • 我还在 gitguru 中找到了一些信息,但实际信息是:Araxis 充其量是稀疏的,我无法从中得出任何结论。
  • 最后,有一些关于旧的stackoverflow post 的信息,但建议的方法对我不起作用。该特定信息面向 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 的设置没有给出任何指示,当从命令行。


编辑:

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

【问题讨论】:

  • 刚刚发布了基于 difftool 和 mergetool 的新解决方案(不在 diff.external 上)。值得一试。
  • 刚刚更新了 diff 脚本并与 Araxis compare.exe 合并:现在完全可以使用了!
  • 为您无法选择答案的问题添加了用户语音条目:stackoverflow.uservoice.com/pages/1722-general/suggestions/…
  • @Joce 供您参考,目前不选择官方答案是设计使然:请参阅meta.stackexchange.com/questions/1413/…
  • 据我所知,Thell 的回答遵循相同的原则,没有 sh 脚本(意思是没有正确的标题)。我仍然会保留我的设置。

标签: windows git diff msysgit araxis


【解决方案1】:

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

尝试将以下内容添加到您的 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      好吧...我得到了它,msysgit 版本 1.6.3.2.1299.gee46c,在 DOS 或 Git Bash 下,带有 Araxis Merge 2009 的评估许可证,v2009.3713:

      方法是使用新的git difftoolgit 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'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 代表真实名称,而不是一些用于差异目的的临时文件名。因此在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 确实为每个文件打开一个选项卡以进行差异或合并。
      试一试,让我们知道;)

      【讨论】:

      • 我必须在 $LOCAL 等中的 $ 前面加上反斜杠 ('\')。然后它起作用了。
      • @Mike:感谢您的反馈。当您必须为 git config 参数转义那些 $ 时,您是在 DOS 会话还是 bash shell 会话中?
      • Thell 只是放弃了一个更紧凑的答案。
      【解决方案4】:

      我认为在 .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"'
      

      【讨论】:

      • 不过,这是为了合并。差异呢?也可以用git config -- global 设置吗?
      【解决方案5】:

      我为这个问题苦苦挣扎了很长一段时间,现在我终于可以说,所有建议的肮脏黑客(如中间 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。

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

      [diff]
          tool = araxis
      

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

      【讨论】:

      • 谢谢!我会在更新到最新的 git 后立即尝试。
      • 希望它会有所帮助。但我不确定你是否必须等待——至少你可以检查一下,“araxis”(不带引号)这个词是否出现在你的 \share\git-gui\lib\mergetool.tcl 中。只需使用记事本打开 .tcl 并使用文本搜索即可。该词的存在清楚地表明您当前的 MSYSGit 已经支持 Araxis。提供 1) 上述内容,2) 您没有配置您称为“araxis”的自定义合并工具 3) PATH 中提到了 Araxis 文件夹,您可以通过调用“git mergetool --tool”来试用它而无需任何额外配置=araxis”。
      • 事实上,您可以尝试立即调用“git mergetool --tool=araxis”。 MSYSGit 应该告诉你,它是否知道具有该名称的工具,如果知道,它是否可以找到所需的可执行文件。如果你幸运的话,它会神奇地发挥作用,而无需你付出任何努力。 =)
      • (忘了提)你的树中应该有一个未解决的合并冲突,以便“git mergetool”说一些关于该工具的合理信息。否则 Git 不会觉得有必要检查工具的存在等。
      • 我刚刚尝试了git difftool --tool=araxis,但收到错误消息:差异工具 araxis 不能用作“比较”。有什么想法吗?
      【解决方案6】:

      您可以尝试关注script mentioned in my answer about 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 external diff 死了,停在 PowerEditor/src/Notepad_plus.cpp。
      【解决方案7】:

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

      【讨论】:

      • 这意味着 TortoiseGit 已成功将该设置转换为系统或全局 Git 属性,不是吗? 'git config --global --list' 或 'git config --list' 现在返回什么?
      • TortoiseGit 似乎没有设置任何东西:npp.pastebin.com/f65b60a49 Weird。我想知道它是怎么做到的。
      • 我的问题完全正确。也许是一个环境变量?
      • 哼。我的 .git 目录中有一个 tortoisegit.data 和一个 tortoisegit.index 。但它们是二进制的,并且似乎不包含对 Araxis 的任何纯文本引用。
      • 哈!它存储在 HKEY_USERS\{some-UUID}\Software\TortoiseGit 中。但我想这并没有让我更接近让 git 从命令行使用 Araxis。
      【解决方案8】:

      由于我一直被定制的 git 差异/合并所困扰,我想我会尝试一劳永逸地解决这个问题。我到了 AraxisMerge 开始的地方,但没有标签的标题。所以这将留给读者作为练习:)

      观察和cmets:

      • 我没有 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"
      

      祝你好运!

      【讨论】:

      • 我有一些适用于 Araxis 的差异和合并脚本,发布在我自己对这个 SO 问题的回答中。你能检查一下并告诉我它们是否适合你吗?
      猜你喜欢
      • 2016-01-23
      • 2023-02-01
      • 2013-07-05
      • 1970-01-01
      • 2019-06-20
      • 2010-10-12
      • 2010-09-30
      • 1970-01-01
      相关资源
      最近更新 更多