首页 > 解决方案 > git diff 的输出在 powershell 中未正确处理

问题描述

我已经阅读了几个关于这个问题的 QA,但没有一个提供答案。有一个解决方法,我在这里再次声明,但我想了解并解决问题。

问题

问题是在 powershell 中执行命令git diff reva revb | Out-File mypatch.patch会产生“垃圾字符”来代替例如德语变音符号(├ñ 而不是 ä)。

调查

当我按照$Env:LESSCHARSET="utf8"某些 QA 中的建议执行时,我确实在终端中得到了正确的输出,但是一旦它被重定向到文件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 一起使用?

标签: windowsgitpowershellcharacter-encodinggit-diff

解决方案


该问题似乎是由错误的设置引起的[Console]::OutputEncoding。如果未设置为 UTF8,请尝试设置:[Console]::OutputEncoding = [System.Text.Encoding]::UTF8.

如果你再使用 , 没关系$Env:LESSCHARSET,我相信它不再使用了。


推荐阅读