Как настроить DiffMerge с помощью msysgit/gitk?
Я только начал использовать Git, и, возможно, я пропустил что-то очевидное, но здесь идет:
- Я использую msysgit 1.6.2.2 в Windows XP
- При установке я выбрал вариант 1 для "Использовать только Git Bash"
Я пытаюсь собрать оболочку script, которую я могу использовать для замены встроенного в 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 и в разделе "Редактирование" > "Настройки" я выбрал ту же оболочку script. При попытке опции "внешний diff" для определенного файла появляется загадочное сообщение об ошибке Unknown Option "
Понятно, что я понятия не имею, что я делаю, поэтому любая помощь будет высоко оценена.
Ответы
Ответ 1
Я просто испытал несколько схожий опыт с установкой Notepad ++ в качестве внешнего редактора с msysgit1.6.2.2.
Ключом было понять, что оболочка не была DOS script, но a/bin/sh script.
Поэтому попробуйте поместить в свой ".bat" (хотя это не совсем бит bat script, расширение здесь не важно):
#!/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, вызывающих инструмент внешней проверки.
Я не тестировал его с помощью DiffMerge, но с WinMerge он работает отлично, как из сеанса DOS, так и из оболочки Git.
#!/bin/sh
"C:/Program Files/WinMerge/WinMergeU.exe" -e -ub "$2" "$5" | cat
(с опцией '-e
', у меня есть только тип на 'ESC
', чтобы закрыть и выйти из инструмента diff: это отлично работает!)
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} [email protected]"
#### END ADDITION ABOVE
eval "${GIT_EDITOR:=vi}" '"[email protected]"'
}
Вы увидите, какой редактор вызывается, с каким параметром.
Теперь, что касается части "Неожиданный параметр":
У меня была такая же ошибка, когда я вызывал WinMergeU.exe с "/e /ub
" вместо "-e -ub
", поэтому первый вопрос:
Вы уверены, что бит "/title1
" не может использоваться как "-title1
" или "-t1
" или "--title1
" или "--t1
"? Это то, что Is может видеть из глава 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"
должен работать нормально.
Ответ 2
Я посмотрел по всему Интернету, чтобы ответить на этот вопрос. Я пробовал все решения выше и в другом месте. Я мог бы получить часть слияния для работы, а не часть 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..."
Ответ 3
Это работает для меня следующим образом:
В ~/.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
VonC - переключение на -t1 и -t2 фиксировало ошибки. Diffmerge теперь работает для git bash:)
После того, как немного выкрикнул патч gitk, который добавил поддержку External Diff, я понял, что он вызывает внешнюю программу Diff напрямую с два файла в качестве аргументов. Поэтому я изменил gitk > Edit > Preferences и применил следующую команду непосредственно в опции External Diff Tool:
"C:/Programs/SourceGear/DiffMerge/DiffMerge.exe" -t1="Old Version" -t2="New Version"
Теперь у меня DiffMerge тоже работает для gitk:-)