【问题标题】:What is the rule of MSYS/MinGW path translation?MSYS/MinGW路径转换的规则是什么?
【发布时间】:2015-08-09 00:19:19
【问题描述】:

我一直在关注this post,了解如何在 git 中使用 Winmerge 作为差异工具。最初它不起作用(现在好了,因此与我的问题无关)。一个关键区别是我使用的是MSYS2 中提供的git,而不是本机Windows 环境下的msysgit。相关的 git config 片段是:

[diff]
        guitool = winmerge

[difftool "winmerge"]
        cmd = \"????/WinMergeU.exe\" /e /s /u /r /wl \"$LOCAL\" \"$REMOTE\"

令我震惊的是,一些 winmerge 的命令行选项在执行时已转换为驱动器号,导致失败。在git difftool -g之后真正执行的命令是:

"????\WinMergeU.exe" /e S:/ U:/ R:/ D:/msys64/wl <file1> <file2>

D:/msys64 是我的 MSYS2 安装前缀。请注意错误中的不一致 — /e 未转换,/wl 转换为路径组件,而所有其他错误都转换为驱动器号。稍后通过使用-而不是/作为所有选项的前缀找到解决方案:

[difftool "winmerge"]
        cmd = \"????/WinMergeU.exe\" -e -s -u -r -wl \"$LOCAL\" \"$REMOTE\"

我的问题是

  1. 为什么不一致的行为?有没有关于cygpath如何进行路径转换的参考资料?
  2. 幸运的是,WinMerge 接受使用- 作为选项指示符。对于那些只接受/ 的GUI 工具,有什么解决方法吗?

【问题讨论】:

标签: git git-diff mingw-w64 winmerge msys2


【解决方案1】:

我相信 MSYS2 试图按照 same behavior in MSYS 将 unix 路径参数转换为 Windows 路径以获取可执行文件,而不依赖于 msys2 dll。

在这种情况下,您可以将单斜杠开头的参数转义为双斜杠,即

\"????/WinMergeU.exe\" //e //s //u //r //wl \"$LOCAL\" \"$REMOTE\"

规则(摘自链接页面):

  • 以驱动器说明符(例如 C:)开头的参数被视为 Windows 路径,不会被转换。
  • 包含 ; 的参数被视为 Windows 路径列表,不会被转换。
  • 以 2 或更多 / 开头的参数被视为转义的 Windows 样式开关,将在传递前导 / 的情况下被移除, 所有 \ 更改为 /。
    • 除了如果/的前导块后面有/,则参数被认为是UNC路径,而前导/不是 已删除。
  • 如果参数的前导 / 后跟驱动器说明符,则 / 被删除,所有 \ 都更改为 /。
  • 如果一个参数有一个=,它被认为是一个变量赋值。右手边是根据这些规则转换的,左手边是根据这些规则转换的 手边的所有 \ 转换为 /,除非右手边开始 带有驱动器说明符。
  • 不以 -、"、' 或 @ 开头并包含 : 后跟 /、: 或 . 的参数;并且 / 被视为 POSIX 路径列表。每个 :-separated 元素根据这些规则进行转换,并且 : 替换为;。任何 / 都转换为 \。
    • 除非 : 后跟 //: 否则它被认为是一个 URL 并且不被转换。
  • 带有前导 / 的参数被转换为第一个 /...
  • 如果参数有前导 - 和 ,,则 , 之后的部分将根据这些规则进行转换,并且整个参数有 \ 转换为 / 除非路径以驱动器说明符开头。
  • 如果参数有前导 - 并且第二个字符是 /,则 / 之后的部分将根据这些规则进行转换。
  • 以@ 开头的参数被视为响应文件参数,@ 后面的文本将根据这些规则进行转换。
  • 根据这些规则处理 ' 或 " 中的参数,忽略引号。

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2020-08-22
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多