How to set Araxis as diff / merge tool for MSYS git?

前端 未结 8 1920
情书的邮戳
情书的邮戳 2020-12-05 08:10

I\'m trying to use Araxis Merge as my diff / merge tool for MSYSGit.

I found a few resources on the net:

  • On the Araxis site, they mention an "easy&q
8条回答
  •  無奈伤痛
    2020-12-05 08:53

    Right... I got it working, with msysgit version 1.6.3.2.1299.gee46c, under DOS or Git Bash, with an evaluation license for Araxis Merge 2009, v2009.3713:

    The approach is to use the new git difftool and git mergetool, instead of plain diff.

    First, let's setup some scripts for those diff and merge tool

    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
    

    Notes:

    • by setting diff.external to the Git script git-difftool--helper, I will use difftool even when I will type 'git diff'.
    • do not forget to pass $MERGED to your difftool script: that is the only variable with the real name of the file being diff'ed. $LOCAL and $REMOTE are temporary names.

    For the merge tool, you would set the following global values:

    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
    

    By setting those tools to some shell scripts, you will be able to switch tools from within those scripts.
    Another approach is to name your tools (mergetool.araxis.cmd, mergetool.winmerge.cmd, ...) and to specify the right tool in the diff.tool or merge.tool setting.

    Create difftool.sh and mergetool.sh in a directory referenced by your global environment variable PATH. They will work even from DOS (and they are sh -- shell -- scripts)

    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" 
    

    Notes:

    • Impossible to have -title1:"someTitle With Space"... only title without space does work..., so for now, try it without any 'titleN' option.
      Got it! You cannot pass the title value directly to the -title option, you need to set it to a local variable, with "' '" quotes combinations (the double quotes will disappear during the shell script execution, leaving the simple quotes, allowing spaces within a title!)
    • $3 represent the real name and not some temporary file name for diff purpose. Hence the use of $3 within the title1 option, with space in it.
    • git diff HEAD^ HEAD would not work in DOS session: only git diff "HEAD^" HEAD would.

    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
    

    I am not sure I those scripts do work properly when multiple files are involved (multiple diffs, multiple files to be merged).
    Just tested it: it works, and Araxis compare.exe does open one tab per file to diff or merge.
    Give it a try and let us know ;)

提交回复
热议问题