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

China☆狼群 提交于 2019-12-01 11:00:23

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.

The correct solution would be using Cygwin's cygpath tool to convert path formats:

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

The same goes for mergetool:

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

Please note that this solution (as well as the question, actually) applies only to Cygwin environment. I've never had Git Bash exhibit the same problem and don't know if it has a utility similar tocygpath.

UPDATE: Unfortunately, the cygpath utility does a poor job converting /dev/null to its Windows equivalent. It will return the invalid \\.\NUL path, and so diffing new files will fail. I'll issue another update with the workaround, as soon as I find it.

Daniel Lee

Looks like a mistake in your gitconfig. Have you seen this Stackoverflow question?

I blogged about setting up P4Merge ages ago before git started supporting it directly but it still works if you are stuck: http://danlimerick.wordpress.com/2011/06/19/git-for-window-tip-use-p4merge-as-mergetool/

EDIT: To be more explicit, it is the escaping that is your problem. In my .gitconfig file for P4Merge it looks like this:

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

So try this:

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

There is a difference with escaping if you set it from the command line or make the change directly in your .gitconfig file.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!