git diff 的输出在 powershell 中处理不正确
The output of git diff is not handled correctly in powershell
我已经阅读了几个关于此问题的 QA,但 none 提供了答案。有一个解决方法,我在这里再次声明,但我想了解并解决问题。
问题
问题是在 powershell 中执行命令 git diff reva revb | Out-File mypatch.patch
会产生 "garbage characters" 而不是例如德语变音符号(├ñ 而不是 ä)。
调查
当我按照某些 QA 中的建议执行 $Env:LESSCHARSET="utf8"
时,我确实在终端中得到了正确的输出,但是一旦它被重定向到文件 mypatch.patch
,变音符号(和其他字符)就会被破坏.即使 git --no-pager diff reva revb
也会在终端中产生正确的输出。但是一旦您想将其通过管道传输到文件,那就错了。所见即所得而非所见即所得!
在我看来 Out-File
的输入已经被破坏,因此设置 -Encoding
参数不会改变任何东西。我不认为 Out-File
是这里的罪魁祸首。例如,命令 $mypatch = git diff reva revb
(即使在 diff 之前添加了 --no-pager)会产生一个变量,例如当该变量打印到终端时,欧元符号或变音符号出现损坏(Ôé¼ 而不是 €)。
我在 Windows 10 (1709) 上尝试了 powershell 5.1 和开源 powershell core 6.0.4。我使用 git 2.18.0.windows.1。它适用于 windows 命令行 (cmd),因此简单的解决方法是从 powershell 控制台调用:
解决方法
cmd /c "git diff reva revb > mypatch.patch"
问题
这如何仅与 powershell 一起工作?
问题似乎是 [Console]::OutputEncoding
设置错误引起的。如果没有设置为UTF8,尝试设置:[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
.
你再用也没关系$Env:LESSCHARSET
,分别我相信已经不用了
我已经阅读了几个关于此问题的 QA,但 none 提供了答案。有一个解决方法,我在这里再次声明,但我想了解并解决问题。
问题
问题是在 powershell 中执行命令 git diff reva revb | Out-File mypatch.patch
会产生 "garbage characters" 而不是例如德语变音符号(├ñ 而不是 ä)。
调查
当我按照某些 QA 中的建议执行 $Env:LESSCHARSET="utf8"
时,我确实在终端中得到了正确的输出,但是一旦它被重定向到文件 mypatch.patch
,变音符号(和其他字符)就会被破坏.即使 git --no-pager diff reva revb
也会在终端中产生正确的输出。但是一旦您想将其通过管道传输到文件,那就错了。所见即所得而非所见即所得!
在我看来 Out-File
的输入已经被破坏,因此设置 -Encoding
参数不会改变任何东西。我不认为 Out-File
是这里的罪魁祸首。例如,命令 $mypatch = git diff reva revb
(即使在 diff 之前添加了 --no-pager)会产生一个变量,例如当该变量打印到终端时,欧元符号或变音符号出现损坏(Ôé¼ 而不是 €)。
我在 Windows 10 (1709) 上尝试了 powershell 5.1 和开源 powershell core 6.0.4。我使用 git 2.18.0.windows.1。它适用于 windows 命令行 (cmd),因此简单的解决方法是从 powershell 控制台调用:
解决方法
cmd /c "git diff reva revb > mypatch.patch"
问题
这如何仅与 powershell 一起工作?
问题似乎是 [Console]::OutputEncoding
设置错误引起的。如果没有设置为UTF8,尝试设置:[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
.
你再用也没关系$Env:LESSCHARSET
,分别我相信已经不用了