1

我一直在关注这篇关于如何在 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 工具,是否有任何解决方法?
4

1 回答 1

1

我相信 MSYS2 试图在 MSYS 中遵循相同的行为将 unix 路径参数转换为 Windows 路径以获得可执行文件,而不依赖于 msys2 dll。

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

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

规则(从链接页面中提取):

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