Как установить Araxis в качестве инструмента сравнения / слияния для MSYS git?
Я пытаюсь использовать Araxis Merge в качестве инструмента сравнения / слияния для MSYSGit.
Я нашел несколько ресурсов в сети:
- На сайте Araxis они упоминают "легкий" способ, но он подразумевает исполняемые файлы (araxisgitdiff.exe и araxisgitmerge.exe), которые не являются частью моего дистрибутива.
- Я также нашел некоторую информацию в gitguru, но реальная информация о: Araxis в лучшем случае редка, и я не мог ничего из этого сделать.
- Наконец, была некоторая информация о старом сообщении stackru, но предложенный метод не работает для меня. Эта конкретная информация была ориентирована на 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.
Редактировать:
Я также пытался с exe-именем, названным как "c:/Program Files/Araxis/Araxis Merge/compare.exe"
как предполагает один из ответов, с такими же результатами.
Редактировать:
Я обнаружил, что его легко установить, если вы используете TortoiseGit, но, похоже, он обрабатывает diff сам по себе, и никакие настройки из TortoiseGit не дают никаких указаний на то, как настроить Araxis в качестве инструмента слияния, когда diff вызывается из командной строки.
Редактировать:
Итак, вопрос в том, есть ли кто-нибудь, кто успешно использует Araxis Merge для сравнения и слияния вещей с MSYSGit, и если да, то как вам это?
8 ответов
Если вы хотите, чтобы 'git diff' всегда использовал araxis, вы можете использовать инструкции в файле справки, но если вы хотите иметь контроль, чтобы использовать 'git diff', как обычно, из командной строки и 'git difftool', чтобы задействовать 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
Документация в araxis была обновлена: http://www.araxis.com/merge/documentation-windows/integrating-with-other-applications
Я могу использовать показанную там конфигурацию без каких-либо изменений.
Правильно... У меня все получилось, с msysgit версии 1.6.3.2.1299.gee46c, под DOS или Git Bash, с оценочной лицензией на Araxis Merge 2009, v2009.3713:
Подход заключается в использовании нового git difftool
а также 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
Я буду использовать difftool, даже когда буду печататьgit diff
". - не забудьте пройти
$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
Установив для этих инструментов некоторые сценарии оболочки, вы сможете переключать инструменты из этих сценариев.
Другой подход - назвать ваши инструменты (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
опцию, вам нужно установить его в локальную переменную, с"' '"
комбинации кавычек (двойные кавычки исчезнут во время выполнения сценария оболочки, оставляя простые кавычки, оставляя пробелы внутри заголовка!)$3
представлять настоящее имя, а не какое-то временное имя файла для разных целей. Отсюда использование$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 открывает одну вкладку на файл для сравнения или слияния.
Попробуйте и дайте нам знать;)
Я думаю, что вам нужно быть немного более осторожным с побегом в вашем.gitconfig.
К сожалению, из-за того, как переменная config расширена и удалена, ваша строка должна быть допустимой командой оболочки, которая затем экранируется "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"'
Я боролся с этой проблемой довольно долго, и теперь я наконец могу сказать, что все предложенные грязные хаки (например, скрипты промежуточной оболочки) скорее не нужны =D. Дело в том, что все последние версии MSYSGit (у меня есть 1.6.4) поддерживают Araxis Merge (у меня есть 2008) из коробки. Неудивительно, что внутренне это называется "араксис". Итак, все, что вам нужно, это установить
[merge]
tool = araxis
в вашем .gitconfig
, Также вы должны включить папку Araxis в переменную окружения PATH (MSYSGit ищет Compare.exe
).
В качестве хорошей меры следует удалить все параметры Git, связанные с "araxis" mergetool, которые вы могли бы настроить (особенно, если вы выбрали именно это имя, как это сделали некоторые люди на этой странице), и все они должны быть удалены. Это включает в себя все под [mergetool "araxis"]
раздел. Обязательно удалите их из всех конфигов (системных, глобальных и репозитория), иначе они могут помешать нормальному поведению "внутреннего инструмента".
В любом случае, если вам интересно, как MSYSGit запустит ваше слияние с Araxis, или вам интересно, какие другие mergetools он поддерживает "из коробки", вам стоит поискать: \share\git-gui\lib\mergetool.tcl
Сценарий в папке установки MSYSGit.
PS. Вы можете избежать установки переменной среды PATH, настроив mergetool.araxis.path
в .gitconfig
, Лично я никогда не удосужился сделать это, так как
- В любом случае я использую Araxis Merge из командной строки.
- Указание пути к каталогу в
.gitconfig
(особенно тот, который нравится"C:\Program Files\Araxis\Araxis Merge\"
(который содержит пробелы) может оказаться трудным сделать правильно, так как он подвержен проблемам с обратной / прямой наклонной чертой, которые мешают MSYSGit.
PPS. Все вышесказанное относится и к тому, чтобы сделать Araxis вашим difftool. Т.е. нужно добавить
[diff]
tool = araxis
и удалить что-нибудь еще в [difftool "araxis"]
раздел, если он есть в вашей конфигурации (не забудьте настроить PATH, хотя).
Один из способов сделать это "просто" - установить TortoiseGit и установить инструменты diff / merge в параметрах TortoiseGit.
Тем не менее, это не решает проблему, если вы хотите diff из командной строки.
Вы можете попробовать следовать сценарию, упомянутому в моем ответе о diffMerge (для Windows), и посмотреть, работает ли он.
Путь к исполняемому файлу может быть лучше выражен с помощью:
#!/bin/sh
"C:/Program Files/Araxis/Araxis Merge/compare.exe" -title1:"$1 (repo version)" -title2:"$1 " -max "$2" "$5"
Так как я был укушен, чтобы настроить git отличается / слияния, я подумал, что я попытаюсь исправить это раз и навсегда. Я дошел до того, что начал AraxisMerge, но без заголовков вкладок. Так что это останется в качестве упражнения для читателя:)
Наблюдения и комментарии:
- У меня не было AraxisMerge, поэтому я скачал его и получил бесплатную 30-дневную пробную лицензию, чтобы опробовать его. Эта версия (кажется, 7.0) поставляется с araxisgitdiff.exe, и ссылка с инструкциями, которые вы отправляете, работает. Так что это будет вариант № 1: обновить слияния араксис.
- Поскольку я работаю с CMD.EXE, "git diff HEAD HEAD^" не работает. '^' Должен быть экранирован в 'git diff HEAD "HEAD^"'.
- Для своей работы я использую kdiff3 в качестве бесплатной замены в Windows, которая работает достаточно хорошо (помогает то, что она поддерживается по умолчанию git)
Начиная с git-diff-driver.sh выдает мне ту же ошибку. После изменения скрипта, содержащего только "echo", это не изменилось. Таким образом, ошибка не зависит от содержимого скрипта.
Затем я удалил часть '/ bin' из.gitconfig, поэтому строка становится
external = "git-diff-driver.sh"
... и это начало работать: оно начало слияние, но правильно не скрывает часть '(репо)'. В качестве обходного пути я получил его без заголовков с:
#!/bin/sh
"/c/Program Files/Araxis/Araxis Merge/compare.exe" -max "$2" "$5"
Удачи!