Как установить Araxis в качестве инструмента diff/merge для MSYS git?

Я пытаюсь использовать Araxis Merge как свой инструмент diff/merge для MSYSGit.

Я нашел несколько ресурсов в сети:

  • На сайте Araxis они упоминают "простой" способ, но подразумевают исполняемые файлы (araxisgitdiff.exe и araxisgitmerge.exe) которые не являются частью моего дистрибутива.
  • Я также нашел некоторую информацию в gitguru, но фактическая информация re: Araxis в лучшем случае разрежена, и я не мог сделать что-то из этого.
  • Наконец, была некоторая информация о более старом postoverflow 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
внешний diff умер, останавливаясь на PowerEditor/src/Notepad_plus.cpp.


Edit:

Я также пробовал с exe, названным как "c:/Program Files/Araxis/Araxis Merge/compare.exe", как было предложено одним из ответов, с теми же результатами.


Edit:

Я обнаружил, что его можно легко установить, если вы используете TortoiseGit, но он, по-видимому, обрабатывает diff сам по себе, и никакие настройки из TortoiseGit не дают никаких указаний о том, как настроить Araxis как инструмент слияния, когда diff вызывается из командная строка.


Edit:

Итак, вопрос: есть ли кто-нибудь, кто успешно использует Araxis Merge для разложения и слияния с MSYSGit, и если да, то как вы это делаете?

Ответ 1

Если вы хотите, чтобы "git diff" всегда использовал araxis, вы можете использовать инструкции в файле справки, но если вы хотите иметь элемент управления для использования "git diff", как обычно, из командной строки и 'git difftool' для взаимодействия с графическим интерфейсом 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

Ответ 3

Правильно... Я получил его работу, с версией msysgit 1.6.3.2.1299.gee46c, под DOS или Git Bash, с оценочной лицензией для Araxis Merge 2009, v2009.3713:

Подходом является использование нового git difftool и git 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 script git-difftool--helper, я буду использовать diffftool, даже когда я наберу "git diff".
  • не забудьте передать $MERGED в ваш diffftool script: это единственная переменная с реальным именем файла, который отличается. $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

Установив эти инструменты для некоторых сценариев оболочки, вы сможете переключать инструменты из этих сценариев.
Другой подход - назвать ваши инструменты (mergetool.araxis.cmd, mergetool.winmerge.cmd,...) и указать правильный инструмент в настройках diff.tool или merge.tool.

Создайте difftool.sh и mergetool.sh в каталоге, на который ссылается ваша глобальная переменная окружения PATH. Они будут работать даже с 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, вам нужно установить его в локальную переменную с комбинациями кавычек "' '" (двойные кавычки исчезнут во время выполнения оболочки script, оставив простые кавычки, что позволит пробелы в заголовке!)
  • $3 представляют действительное имя, а не некоторое временное имя файла для цели diff. Следовательно, использование $3 в опции title1 с пробелом в нем.
  • 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 открывает одну вкладку для каждого файла для разграничения или слияния.
Попробуйте и дайте нам знать;)

Ответ 4

Я думаю, что вам нужно быть немного более осторожным с вашим побегом в вашем .gitconfig.

К сожалению, из-за того, что переменная конфигурации расширяется и обнуляется, ваша строка должна быть допустимой командой оболочки, которая затем "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"'

Ответ 5

Я долгое время боролся с этой проблемой, и теперь, наконец, могу сказать, что все предлагаемые грязные хаки (например, промежуточные сценарии оболочки) являются излишними = D. Дело в том, что все последние версии MSYSGit (у меня есть 1.6.4) поддерживают Araxis Merge (у меня есть 2008) из коробки. Неудивительно, что внутри он называется "араксис". Итак, все, что вам нужно, это установить

[merge]
    tool = araxis

в .gitconfig. Также вы должны включить папку Araxis в свою переменную среды PATH (MSYSGit ищет Compare.exe).

Для хорошей меры, другие настройки Git, связанные с "araxis" mergetool, которые вы могли бы настроить (особенно, если вы случайно выбрали именно это имя, как и некоторые люди на этой странице), все должны быть удалены, Это включает все в разделе [mergetool "araxis"]. Обязательно удалите их из всех конфигураций (системного, глобального и репозитория), иначе они могут помешать нормальному поведению "внутреннего инструмента".

В любом случае, если вы заинтересованы в том, как MSYSGit запустит ваш Araxis Merge или задается вопросом о том, какие другие слияния он поддерживает из коробки, место для поиска - \share\git-gui\lib\mergetool.tcl script в папке установки MSYSGit.

PS. Возможно, вы сможете избежать установки переменной среды PATH, настроив mergetool.araxis.path в .gitconfig. Лично я никогда не потрудился сделать это, поскольку

  • Я все равно использую Araxis Merge из командной строки.
  • Указание пути к каталогу в .gitconfig (особенно, например, "C:\Program Files\Araxis\Araxis Merge\", который содержит пробелы) может оказаться трудным для выполнения правильно, поскольку он подвержен ошибкам обратной косой черты/переадресации, которые заражают MSYSGit.

ПФС. Все вышеизложенное относится к тому, чтобы сделать Araxis вашим diffftool. I.e, вам нужно добавить

[diff]
    tool = araxis

и удалите что-нибудь еще в разделе [difftool "araxis"], если у вас есть это в вашей конфигурации (не забудьте настроить PATH, хотя).

Ответ 6

Вы можете попытаться выполнить script, упомянутый в моем ответе о diffMerge (для Windows), и посмотреть, работает ли он.

Исполняемый путь может быть лучше выражен с помощью:

#!/bin/sh

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

Ответ 7

Один из способов найти это просто: установить TortoiseGit и установить инструменты diff/merge в параметрах TortoiseGit.
Однако это не относится к проблеме, если вы хотите отличить от командной строки.

Ответ 8

Так как меня укусили под индивидуальные 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, для меня была такая же ошибка. После изменения script, чтобы содержать только "эхо", это не изменилось. Таким образом, ошибка не зависит от содержимого script.

Затем я удалил часть '/bin' из .gitconfig, поэтому строка становится

external = "git-diff-driver.sh"

... и это начало работать: оно начало слияние, но оно не выходит из части "(repo)" правильно. В качестве обходного пути я получил его без заголовков:

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

Удачи!