1

Winmerge を git の差分ツールとして使用する方法に関するこの投稿をフォローしています。最初はうまくいきません(よろしいので、ここでの私の質問には関係ありません)。主な違いの 1 つは、ネイティブ Windows 環境のmsysgitではなく、MSYS2内で提供される git を使用していることです。関連する 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:/msys64MSYS2 インストール プレフィックスはどこにありますか。エラーの矛盾に注意してください —/e変換されていない、/wlパス コンポーネントに変換されている、その他すべてがドライブ文字に変換されている。すべてのオプションのプレフィックスとして-代わりに使用することにより、後で解決策が見つかります。/

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

私の質問は:

  1. 一貫性のない動作の理由は? cygpathパス変換の実行方法に関する参照はありますか?
  2. 幸いなことに、WinMerge は-オプション インジケーターとしての使用を受け入れます。/のみが受け入れられるGUI ツールの場合、回避策はありますか?
4

1 に答える 1

1

MSYS2は、msys2 dll に依存しない実行可能ファイルの unix パス引数を Windows パスに変換するために、MSYS と同じ動作に従おうとしたと思います。

この場合、単一のスラッシュで始まる引数を二重のスラッシュでエスケープできます。

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

ルール (リンクされたページから抽出):

  • ドライブ指定子 (例: C:) で始まる引数は Windows パスと見なされ、変換されません。
  • ; を含む引数 Windows パス リストと見なされ、変換されません。
  • 2 つ以上の / で始まる引数は、エスケープされた Windows スタイルのスイッチと見なされ、先頭の / が削除され、すべての \ が / に変更されて渡されます。
    • ただし、/ の先頭ブロックの後に / がある場合、引数は UNC パスと見なされ、先頭の / は削除されません。
  • 引数の先頭に / があり、その後にドライブ指定子が続く場合、/ が削除され、すべての \ が / に変更されます。
  • 引数に = が含まれている場合、変数の割り当てと見なされます。右側がドライブ指定子で始まらない限り、右側はこれらの規則に従って変換され、左側はすべて \ が / に変換されます。
  • -、"、'、または @ で始まらず、: の後に /、:、または .; が含まれ、/ が POSIX パス リストと見なされる引数。: で区切られたすべての要素は、これらの規則に従って変換されます。 、および : は ; に置き換えられます。すべての / は \ に変換されます。
    • : の後に //: が続く場合を除き、URL と見なされ、変換されません。
  • / で始まる引数は、最初の /... まで変換されます。
  • 引数の先頭に - と , がある場合、, の後の部分はこれらの規則に従って変換され、パスがドライブ指定子で始まらない限り、引数全体が \ に / に変換されます。
  • 引数の先頭に - があり、2 文字目が / の場合、/ 以降の部分はこれらの規則に従って変換されます。
  • 先頭に @ が付いた引数は応答ファイルの引数と見なされ、@ に続くテキストはこれらの規則に従って変換されます。
  • ' または " 内の引数は、これらの規則に従って処理され、引用符は無視されます。
于 2015-07-14T02:13:21.877 に答える