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.