Я прочитал несколько тестов на эту проблему, но ни один из них не дал ответа. Есть обходной путь, о котором я здесь снова говорю, но я хочу понять и решить проблему.
Проблема
Проблема в том, что выполнение команды git diff reva revb | Out-File mypatch.patch
в powershell создает, например, "символы мусора" вместо. Немецкие умлауты (├ñ вместо ä).
Исследование
Когда я выполняю $Env:LESSCHARSET="utf8"
, как предложено в некоторых тестах, я получаю правильный вывод в терминале, но как только он перенаправляется в файл mypatch.patch
, умлауты (и другие символы) искажаются. Четный git --no-pager diff reva revb
приводит к правильному выводу в терминале. Но как только вы хотите передать это в файл, это неправильно. То, что вы видите, это , а не , что вы получаете!
Мне кажется, что ввод в Out-File
уже искажен, и поэтому установка аргумента -Encoding
ничего не меняет. Я не думаю, что Out-File
виноват здесь. Например, команда $mypatch = git diff reva revb
(даже с добавлением --no-pager перед diff) приводит к переменной, например, Символ евро или умлауты выглядят искаженными (¼é¼ вместо €), когда эта переменная выводится на терминал.
Я пробовал PowerShell 5.1 и ядро PowerShell с открытым исходным кодом 6.0.4 в Windows 10 (1709). Я использую git 2.18.0.windows.1. Он прекрасно работает с командной строкой Windows (cmd), поэтому простой обходной путь - вызов из консоли powershell:
Обход
cmd /c "git diff reva revb > mypatch.patch"
Вопрос
Как это работает только с powershell?