Git Файл diff tmp недопустим для окон при использовании внешней программы в Windows 7

Я следую документам на странице конфигурации Git и пытаюсь применить это к моей среде Windows 7. Когда я запустил, скажите: "git diff file0" Я получаю сообщение об ошибке в P4Merge:

Errors: '/tmp/cH9ccM_file0' is (or points to) an invalid file.

Это истинное утверждение. У меня нет каталога под названием "/tmp". Я проверил в C:\tmp, C:\cygwin\tmp и% PROGRAMFILES%\ Git\tmp.

Любые идеи о том, как изменить этот каталог на то, что у меня есть?

EDIT:

Дополнительная информация. В конечном счете, я пытаюсь заставить WinMerge (или любую внешнюю программу) работать. Я решил использовать P4Merge раньше, потому что я не мог заставить WinMerge работать, поэтому решил пойти с программой, которая использовалась в вышеупомянутой статье.

Ниже приведена соответствующая часть моего .gitconfig:

[merge]
tool = extMerge
[mergetool "extMerge"]
cmd = extMerge \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
trustExitCode = false
[diff]
external = extDiff

extDiff script:

#!/usr/bin/sh
# extDiff
# Wrapper for using an external diff tool in Git
echo "File 1: $2"
echo "File 2: $5"
/usr/local/bin/extMerge "$2" "$5"

extMerge script:

#!/usr/bin/sh
echo $*
/c/Program\ Files\ \(x86\)/WinMerge/WinMergeU.exe $*

Итак, если я изменяю файл index.html и запускаю git diff, это результат:

File 1: /tmp/XfGpOC_index.html
File 2: index.html

Ответ 1

Я предполагаю, что вы используете Cygwin... Я думаю, проблема в том, что для Cygwin,/tmp существует, но для Windows это не (это где-то еще). Для меня Cygwin/tmp находится в $HOME/AppData/cygwin/tmp и где был файл. Это может отличаться в зависимости от того, как вы установили Cygwin. Как только вы найдете Cygwin/tmp, вам просто нужно найти хорошую переменную среды (или создать новую, если вам нужно), чтобы получить путь Windows к временному файлу. Это сработало для меня:

[diff]
   tool = p4mergeTool
[difftool "p4mergeTool"]
   cmd = p4merge.exe $HOMEPATH/AppData/cygwin$LOCAL $REMOTE

Я использовал HOMEPATH вместо HOME, потому что (кажется) HOMEPATH - это переменная среды Windows HOME (\ Users\myusername), а HOME - переменная среды cygwin HOME (/cygdrive/c/Users/myusername). Из Cygwin напечатайте printenv, чтобы увидеть, какие переменные среды могут быть подходящими.

Ответ 2

Правильное решение будет использовать инструмент Cygwin cygpath для преобразования форматов пути:

[difftool "p4merge"]
    cmd = p4merge \"$(cygpath -w \"$LOCAL\")\" \"$(cygpath -w \"$REMOTE\")\"

То же самое относится к mergetool:

[mergetool "p4merge"]
    keepBackup = false
    trustExitCode = true
    cmd = p4merge \"$(cygpath -w \"$BASE\")\" \"$(cygpath -w \"$LOCAL\")\" \"$(cygpath -w \"$REMOTE\")\" \"$(cygpath -w \"$MERGED\")\"

Обратите внимание, что это решение (а также вопрос, на самом деле) относится только к среде Cygwin. У меня никогда не было проблемы с Git Bash и не знаю, есть ли у него утилита, похожая на cygpath.

UPDATE: К сожалению, утилита cygpath выполняет плохую работу по преобразованию /dev/null в ее эквивалент Windows. Он вернет недействительный путь \\.\NUL, и поэтому новые новые файлы не удастся. Я выложу еще одно обновление с обходным решением, как только найду его.

Ответ 3

Похоже на ошибку в вашем gitconfig. Вы видели этот fooobar.com/info/2691/...?

Я писал о настройке P4Merge в возрасте до того, как git начал поддерживать его напрямую, но он все еще работает, если вы застряли: http://danlimerick.wordpress.com/2011/06/19/git-for-window-tip-use-p4merge-as-mergetool/

EDIT: чтобы быть более явным, именно побег - это ваша проблема. В моем файле .gitconfig для P4Merge он выглядит так:

cmd = p4merge.exe /\"$BASE/\" /\"$LOCAL/\" /\"$REMOTE/\" /\"$MERGED/\"

Итак, попробуйте следующее:

cmd = extMerge /\"$BASE/\" /\"$LOCAL/\" /\"$REMOTE/\" /\"$MERGED/\"

Есть разница с экранированием, если вы установите его из командной строки или внесите изменения непосредственно в файл .gitconfig.