2009-04-23 4 views
21

Я только начал использовать Git, и возможно, я пропустил что-то очевидное, но здесь идет:Как настроить DiffMerge с помощью msysgit/gitk?

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

Я пытаюсь собрать сценарий оболочки, который я могу использовать для замены встроенного git diff с DiffMerge. На основе this thread на 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% 

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

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

+0

Только что завершил мой ответ с определенными элементами «DiffMerge», как было запрошено. – VonC

ответ

9

Я просто испытал несколько аналогичный опыт с setting Notepad++ as my external editor with 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 

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

Я не тестировал его с помощью 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} [email protected]" 
#### END ADDITION ABOVE 
    eval "${GIT_EDITOR:=vi}" '"[email protected]"' 
} 

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

Теперь, что касается «Неожиданный параметра» часть:
я имел такую ​​же ошибку, когда я назвал WinMergeU.exe с «/e /ub» вместо «-e -ub», поэтому первый вопрос:
Вы уверены, , что бит "/title1" не может использоваться как "-title1" или "-t1" или "--title1" или "--t1"? Это то, что можно увидеть с chapter 9 "Command Lines Arguments" of the pdf documentation of 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" 

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

+0

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

+0

«Ключ должен был понять, что оболочка не была сценарием DOS, а скриптом/bin/sh». Для таких, как я, не активируя параметр «Использовать только Git Bash», это должен быть сценарий Windows (.cmd более моден ...) То же, что и у вас, но с использованием% 2 вместо $ 2 – PhiLho

4

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

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

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

Теперь я DiffMerge работал на gitk тоже :-)

+0

Удивительно, это действительно сработало! И спасибо за отзыв о gitk. +1 – VonC

+0

С более вероятным вариантом Diffmerge «C:/Program Files/SourceGear/Common/DiffMerge/sgdm.exe» и -t1/-t2 больше не работает. Если вы отпустите это, вы получите хотя бы окно сравнения – Ghita

8

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

В ~/.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;)

+0

Спасибо. Ты спас меня с этим. – Andrei

14

Я посмотрел по всему интернету для ответа на это. Я пробовал все решения выше и в другом месте. Я мог бы получить часть слияния для работы, а не часть 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..." 
+0

Подходит для простого решения, которое имеет смысл. – Bnjmn

+0

Как @Bnjmn сказал +1 для простого решения, которое требует только редактирования .gitconfig – JeffH

+0

Ключ для меня менялся: .../merge/replace = ... 'to' ... --merge --replace =. ..'; [Документы SourceGear] (https://sourcegear.com/diffmerge/webhelp/sec__git__windows__msysgit.html) кажутся неправильными. –