Как настроить DiffMerge с помощью msysgit / gitk? - PullRequest
21 голосов
/ 23 апреля 2009

Я только начал использовать Git и, возможно, я упустил что-то очевидное, но здесь идет речь:

  • Я использую msysgit 1.6.2.2 в Windows XP
  • При установке я выбрал вариант 1 «Использовать только Git Bash»

Я пытаюсь собрать скрипт-обертку, который можно использовать для замены встроенного git diff на DiffMerge. Основываясь на этой теме на SO, я создал следующий пакетный файл:

@echo off
REM ---- Switch forward slashes to back slashes ----
set oldW=%2
set oldW=%oldW:/=\%
set newW=%5
set newW=%newW:/=\%

REM ---- Launch DiffMerge ----
"C:/Programs/SourceGear/DiffMerge/DiffMerge.exe" /title1="Old Version" %oldW% /title2="New Version" %newW%

Я поместил файл bat в% GIT_INSTALL% / cmd и отредактировал мой файл .gitconfig следующим образом:

[diff]
external = C:/Programs/git/cmd/git-diff-wrapper.bat

Если я запускаю Git Bash и выполняю git diff HEAD HEAD ~ - myfile

Я получаю сообщение File (\dev\null) not found - что с учетом того, что я на Windows, не удивительно.

Нажав на, я запустил gitk и в Edit> Preferences я выбрал тот же скрипт-обертку. При использовании опции «external diff» для определенного файла выдается загадочное сообщение об ошибке Unknown Option "

Очевидно, я понятия не имею, что я делаю, поэтому любая помощь будет высоко ценится.

Ответы [ 4 ]

15 голосов
/ 28 мая 2011

Я посмотрел по всему интернету, чтобы найти ответ на этот вопрос. Я попробовал все решения выше и в других местах. Я мог бы заставить часть слияния работать, а не часть различий или наоборот. Так что в итоге я взломал мое собственное простое решение из всей информации, которую я получил в интернете и которая работает для меня. Для редактирования .gitconfig, который обычно находится в следующем каталоге C:\Documents and Settings\[username], не требуется никаких сценариев. Вам нужно уже установить программу DiffMerge.

Вот соответствующая выдержка из моего .gitconfig файла. Вам просто нужно отредактировать путь к вашей версии DiffMerge. Обратите внимание , что я использовал старый формат DOS 8.3 в пути

[diff]
    tool = diffm
[difftool "diffm"]
    cmd = "H:/PROGRA~1/SourceGear/DiffMerge/DiffMerge.exe $LOCAL $REMOTE"
    prompt = false

[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    cmd = "H:/PROGRA~1/SourceGear/DiffMerge/DiffMerge.exe --merge --result=$MERGED $LOCAL $BASE $REMOTE" 
    trustExitCode = false
    keepBackup = false

Вы также можете настроить его, используя команды git config --replace --global [options], если хотите.


Это простое решение прекрасно работает и для меня. Для более свежих версий DiffMerge (3.3.1) необходимо изменить путь к команде:

    cmd = "C:/PROGRA~1/SourceGear/Common/DiffMerge/sgdm.exe ...etc..."
9 голосов
/ 24 апреля 2009

Я только что испытал несколько похожий опыт с настройкой Notepad ++ в качестве моего внешнего редактора с msysgit1.6.2.2 .

Ключ должен был понять, что оболочкой был не сценарий DOS, а сценарий / bin / sh.

Итак, попробуйте вставить свой ".bat" (хотя это не совсем скрипт bat, расширение здесь не важно):

#!/bin/sh

# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode

"C:/Programs/SourceGear/DiffMerge/DiffMerge.exe" /title1="Old Version" "$2" /title2="New Version" "$5" | cat

Не беспокойтесь о том, чтобы все '\' пошло '/': это делается скриптами Git, вызывающими внешний инструмент сравнения.

Я не тестировал его с DiffMerge, но с WinMerge он прекрасно работает как из сеанса DOS, так и из оболочки Git.

#!/bin/sh
"C:/Program Files/WinMerge/WinMergeU.exe" -e -ub "$2" "$5" | cat

(с опцией '-e' я просто набрал 'ot type на' ESC ', чтобы закрыть и выйти из инструмента diff: это прекрасно работает!)


alt text average_geek добавляет в комментариях:

добавил заголовок '/bin/sh' и снова попытался запустить git diff.
На этот раз ошибка:
Unexpected parameter 'C:/Docume~/avggeek/LOCALS~1/Temp/.diff_b08444
Есть ли способ узнать, какие параметры передаются при вызове git diff?

1 / На самом деле есть способ узнать, какие параметры передаются!
Добавьте следующую строку в файл C:\Program Files\Git\libexec\git-core\git-sh-setup:

git_editor() {
    : "${GIT_EDITOR:=$(git config core.editor)}"
    : "${GIT_EDITOR:=${VISUAL:-${EDITOR}}}"
    case "$GIT_EDITOR,$TERM" in
    ,dumb)
        echo >&2 "No editor specified in GIT_EDITOR, core.editor, VISUAL,"
        echo >&2 "or EDITOR. Tried to fall back to vi but terminal is dumb."
        echo >&2 "Please set one of these variables to an appropriate"
        echo >&2 "editor or run $0 with options that will not cause an"
        echo >&2 "editor to be invoked (e.g., -m or -F for git-commit)."
        exit 1
        ;;
    esac
#### ADD THIS LINE BELOW
    echo >&2 "editor is ${GIT_EDITOR:=vi} $@."
#### END ADDITION ABOVE
    eval "${GIT_EDITOR:=vi}" '"$@"'
}

Вы увидите, какой редактор вызывается, с каким параметром.

Теперь по части «Неожиданный параметр»:
У меня была такая же ошибка, когда я вызывал WinMergeU.exe с "/e /ub" вместо "-e -ub", поэтому первый вопрос:
Вы уверены, что бит "/title1" нельзя использовать как "-title1", "-t1", "--title1" или "--t1"? Это то, что можно увидеть из главы 9 «Аргументы командных строк» ​​pdf документации DiffMerge .
Если нет, я подозреваю, что некоторые двойные кавычки предназначены для правильного разграничения различных параметров. Что-то вроде:

"/title1="Old Version"" "$2" "/title2="New Version"" "$5"
or
"/title1=\"Old Version\"" "$2" "/title2=\"New Version\"" "$5"

Но мои деньги скорее будут в форме "-title1" или "-t1":

-t1="Old Version" "$2" -t2="New Version" "$5"

должно работать просто отлично.

8 голосов
/ 28 октября 2009

Это работает для меня следующим образом:

В ~/.gitconfig:

[merge]
tool = diffmerge
[mergetool "diffmerge"]
cmd = \"C:/Program Files/git/cmd/git-diffmerge-merge.sh\" \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
trustExitCode = false

В C:\Program Files\Git\cmd\git-diffmerge-merge.sh:

#!/bin/sh

localPath="$2"
basePath="$1"
remotePath="$3"
resultPath="$4"

if [ ! -f $basePath ]
then
    basePath="~/diffmerge-empty"
fi

"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" --merge --result="$resultPath" "$localPath" "$basePath" "$remotePath" --title1="Mine" --title2="Merged: $4" --title3="Theirs"

Часть кредита идет на http://therightstuff.de/2009/01/28/Setting-Up-SourceGear-DiffMerge-With-Git.aspx;)

4 голосов
/ 24 апреля 2009

VonC - переключение на -t1 и -t2 исправило ошибки. Diffmerge теперь работает для git bash:)

После небольшого нажатия на патч gitk , который добавил поддержку External Diff, я понял, что он вызывает программу External Diff напрямую с двумя файлами в качестве аргументов. Поэтому я изменил gitk> Edit> Preferences и поместил следующую команду прямо в опцию External Diff Tool:

"C:/Programs/SourceGear/DiffMerge/DiffMerge.exe" -t1="Old Version" -t2="New Version"

Теперь у меня DiffMerge работает и для gitk :-)

...