【问题标题】:git diff tmp file invalid on windows when using external program on Windows 7在 Windows 7 上使用外部程序时,git diff tmp 文件在 Windows 上无效
【发布时间】:2013-05-09 05:03:18
【问题描述】:

我正在关注Git configuration page 中的文档,并尝试将其应用于我的 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。

关于如何将此目录更改为我所拥有的任何想法?

编辑:

附加信息。最终,我试图让 WinMerge(或任何外部程序)工作。我之前选择使用 P4Merge,因为我无法让 WinMerge 工作,所以我决定使用上述文章中使用的程序。

下面是我的 .gitconfig 的相关部分:

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

extDiff 脚本:

#!/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 脚本:

#!/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

【问题讨论】:

    标签: git external windows-7-x64 git-diff


    【解决方案1】:

    正确的解决方案是使用 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的实用程序。

    更新:不幸的是, cygpath 实用程序在将 /dev/null 转换为 Windows 等效项时表现不佳。它将返回无效的 \\.\NUL 路径,因此区分新文件将失败。一旦找到解决方法,我将发布另一个更新。

    【讨论】:

      【解决方案2】:

      我假设您使用的是 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 以查看适合的环境变量。

      【讨论】:

      • 最后。这个答案让我很开心!
      • 抱歉,它容易出错且不灵活。它不会正确处理绝对路径和相对路径,而 Git 同时使用两者。到头来,它会成为一个非常糟糕的问题的根源,即使它一开始似乎工作正常。
      • 仅供参考,在此环境中我最终得到的 cygwin 路径是 c:/tools/cygwin/tmp:(Windows 2012 R2 Server Standard Ver 6.3 Build 9600,cygwin DLL version 2.0.4)
      【解决方案3】:

      看起来你的 gitconfig 有错误。你见过这个Stackoverflow question吗?

      在 git 开始直接支持 P4Merge 之前,我很久以前就写过关于设置 P4Merge 的博客,但如果您遇到困难,它仍然可以工作:http://danlimerick.wordpress.com/2011/06/19/git-for-window-tip-use-p4merge-as-mergetool/

      编辑:更明确地说,转义是您的问题。在我的 P4Merge 的 .gitconfig 文件中,它看起来像这样:

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

      所以试试这个:

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

      如果您从命令行设置或直接在 .gitconfig 文件中进行更改,则转义会有所不同。

      【讨论】:

      • 不是转义,而是路径。例如,带有 Cygwin 的 Git 将 /tmp/... 作为参数传递给 P4Merge。但是,这样的路径在 Windows 环境中无效,并且由于 P4Merge 不是 Cygwin 应用程序,它不知道路径格式不正确。当它尝试向系统请求文件时,发现文件(路径)不存在。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      相关资源
      最近更新 更多