Какое правило преобразования пути MSYS / MinGW?

Я слежу за этим сообщением о том, как использовать Winmerge в качестве сравнения. инструмент в git. Сначала это не работает (хорошо, поэтому не имеет отношения к моему вопросу здесь). Одно из ключевых отличий заключается в том, что я использую git, предоставленный внутри MSYS2, а не msysgit в собственной среде Windows. Соответствующий фрагмент конфигурации git:

[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 допускает использование - в качестве индикатора опции. Есть ли обходной путь для тех инструментов с графическим интерфейсом, где допускается только /?

person Abel Cheung    schedule 27.05.2015    source источник
comment
Вы пробовали это с недавним git для Windows (на основе msys2) в github.com? / git-for-windows / git / Release?   -  person VonC    schedule 27.05.2015
comment
@VonC Спасибо, я обязательно попробую, приятно видеть, что есть альтернатива msysgit, которая обновляет git, хотя мой OP предназначен для запуска версии предварительно упакованного git внутри MSYS2 (который сейчас версия 2.4.1).   -  person Abel Cheung    schedule 27.05.2015


Ответы (1)


Я считаю, что MSYS2 пытался следовать аналогичному поведению в MSYS, чтобы преобразовать аргументы пути unix в путь Windows для исполняемый файл, не зависящий от msys2 dll.

В этом случае вы можете избежать аргументов, начинающихся с одинарной косой черты с двойной косой чертой, т.е.

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

Правила (извлеченные из связанной страницы):

  • Аргументы, начинающиеся со спецификатора диска (например, C :), считаются путями Windows и не преобразуются.
  • Аргументы, содержащие a; считаются списками путей Windows и не конвертируются.
  • An argument starting with 2 or more / is considered an escaped Windows style switch and will be passed with the leading / removed and all \ changed to /.
    • Except that if there is a / following the leading block of /, the argument is considered to be a UNC path and the leading / is not removed.
  • Если в начале аргумента идет /, за которым следует спецификация диска, / удаляется, а все \ заменяются на /.
  • Если аргумент имеет =, это считается присвоением переменной. Правая часть преобразуется в соответствии с этими правилами, а левая часть имеет все \ преобразовано в /, если правая часть не начинается со спецификатора диска.
  • An argument that doesn't start with -, ", ', or @ and contains a : followed by /, :, or .; and a / is considered a POSIX path list. Every :-separated element is converted according to these rules, and the : are replaced with ;. Any / are converted to \.
    • Unless the : is followed by //: then it is considered a URL and not converted.
  • Аргумент с ведущим / преобразуется до первого / ...
  • Если аргумент имеет начало - и, то часть после, преобразуется в соответствии с этими правилами, и весь аргумент \ преобразован в /, если путь не начинается со спецификатора диска.
  • Если в аргументе есть ведущий символ, а второй символ - /, то часть от / и далее преобразуется в соответствии с этими правилами.
  • Аргумент с ведущим @ считается аргументом файла ответов, и текст, следующий за @, преобразуется в соответствии с этими правилами.
  • Аргумент внутри 'или "обрабатывается в соответствии с этими правилами с игнорированием кавычек.
person user2172816    schedule 14.07.2015