windows - 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 一起使用?
解决方案
该问题似乎是由错误的设置引起的[Console]::OutputEncoding
。如果未设置为 UTF8,请尝试设置:[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
.
如果你再使用 , 没关系$Env:LESSCHARSET
,我相信它不再使用了。
推荐阅读
- snowflake-cloud-data-platform - 如何从 Snowflake 中的所有模式中查找存储过程和函数?
- ruby - Rails 会覆盖 ruby 的默认记录器吗?
- node.js - 有没有办法将文件源 URL 或 .buffer() 传递到 Puppeteer fileChooser 而无需事先下载文件进行上传?
- winforms - PowerShell - DPI 感知表单
- sql-server - SQL Server 2008R2 超高内存消耗——大量被盗页面和巨大的日志文件
- r - 如何返回不同值的数据框
- python - 如何在我的数据上应用 pyannote.audio 模型而不被“杀死”?
- prolog - Prolog:未处理的异常:pce(object)`@prolog_warnings/emacs_hit_list'不存在
- javascript - 如何使用二维数组将形状绘制到画布上
- c++ - How to implement insert vector c++?