Как настроить DiffMerge с помощью msysgit/gitk?

Я только начал использовать 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 и в разделе «Правка»> «Настройки» выбрал тот же сценарий-оболочку. Попытка «внешнего сравнения» для определенного файла дает загадочное сообщение об ошибке Unknown Option "

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


person avggeek    schedule 23.04.2009    source источник
comment
Только что завершил свой ответ некоторыми специфическими элементами DiffMerge, как и было запрошено.   -  person VonC    schedule 24.04.2009


Ответы (4)


Я только что испытал нечто подобное с установка Notepad++ в качестве внешнего редактора с помощью msysgit1.6.2.2.

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

Так что попробуйте вставить свой ".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 Shell.

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

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


alt textaverage_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 "Команды Lines Arguments" из 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"

должно работать нормально.

person VonC    schedule 23.04.2009
comment
Я добавил заголовок /bin/sh и снова попытался запустить git diff. На этот раз ошибка: Неожиданный параметр «C:/Docume~/avggeek/LOCALS~1/Temp/.diff_b08444 Is there a way to see what are the parameters getting passed when I call git diff»? - person avggeek; 24.04.2009
comment
Ключ был в том, чтобы понять, что оболочка была не сценарием DOS, а сценарием /bin/sh. Для тех, кто, как и я, не активирует параметр «Использовать только Git Bash», это должен быть скрипт Windows (.cmd более моден...) То же, что и ваш, но с использованием% 2 вместо $ 2 - person PhiLho; 06.01.2012

Я перерыл весь интернет в поисках ответа на этот вопрос. Я пробовал все решения выше и в других местах. Я мог бы заставить работать часть слияния, а не часть diff или наоборот. Итак, в конце концов я собрал свое собственное простое решение из всей информации, полученной в Интернете, которое работает для меня. Это не требует никаких скриптов, только то, что вы редактируете свой .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..."
person Wavesailor    schedule 27.05.2011
comment
Реквизит для простого решения, которое просто имеет смысл. - person Bnjmn; 28.05.2012
comment
Как сказал @Bnjmn, +1 за простое решение, которое требует только редактирования .gitconfig - person JeffH; 07.06.2012
comment
Ключом для меня было изменение ... /merge /replace=... на ... --merge --replace=...; документы SourceGear кажутся неверными. - person Kenny Evitt; 05.08.2015

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

In ~/.gitconfig:

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

In 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 ;)

person Max    schedule 28.10.2009
comment
Спасибо. Ты спас меня этим. - person Andrei; 25.10.2011

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

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

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

Теперь у меня есть DiffMerge, работающий и с gitk :-)

person avggeek    schedule 24.04.2009
comment
Круто, получилось! И спасибо за отзыв о gitk. +1 - person VonC; 24.04.2009
comment
С последним Diffmerge путь более вероятен C:/Program Files/SourceGear/Common/DiffMerge/sgdm.exe и -t1/-t2 больше не работает. Если вы оставите это в стороне, вы получите как минимум окно сравнения - person Ghita; 08.12.2012