Search code examples
gitexternalwindows-7-x64git-diff

git diff tmp file invalid on windows when using external program on Windows 7


I'm following the docs from the Git configuration page and trying to apply this to my Windows 7 environment. When I run say, "git diff file0" I get an error in P4Merge:

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

This is a true statement. I do not have a directory called "/tmp". I've checked in C:\tmp, C:\cygwin\tmp, and %PROGRAMFILES%\Git\tmp.

Any ideas on how to change this directory to something I do have?

EDIT:

Additional info. Ultimately, I'm trying to get WinMerge (or any external program) to work. I chose to use P4Merge earlier, because I couldn't get WinMerge to work, so I decided to go with the program that was used in the aforementioned article.

Below is the relevant part of my .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 $*

So if I change a file called index.html, and run git diff, this is the result:

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

Solution

  • I assume you're using Cygwin... I think the problem is that for Cygwin, /tmp exists, but for Windows, it doesn't (it's somewhere else). For me, Cygwin's /tmp is located in $HOME/AppData/cygwin/tmp and that's where the file was. This might be different depending on how you installed Cygwin. Once you find Cygwin's /tmp, it's just a matter of finding a good environment variable (or creating a new one, if you need) to get a Windows path to the temp file. This worked for me:

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

    I used HOMEPATH instead of HOME, because (it appears) HOMEPATH is the Windows HOME environment variable (\Users\myusername), while HOME is the cygwin HOME environment variable (/cygdrive/c/Users/myusername). From Cygwin, type printenv to see which environment variables might be a good fit.