查看: 88|回复: 3

git log中文乱码:PowerShell的less编码修复

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在PowerShell、WebStorm内置终端(默认PowerShell)执行git log时,中文提交信息会显示为乱码。直接执行git --no-pager log可以消除乱码,但历史会一次性刷屏,翻找困难。目标是在保留分页的前提下让中文正常显示。这类问题在WebStorm内置终端里更顽固,原因与Windows环境变量在进程启动时的继承机制有关。

问题本质是编码链上有三个环节:Git输出、less分页器渲染、PowerShell控制台显示。默认情况下,Git输出通常是UTF-8;less渲染取决于LESSCHARSET,Windows下常不识别UTF-8;PowerShell控制台代码页为936(GBK)。三个环节任何一处字符集不一致,中文就会乱码,所以只改一处往往不够,需要把三端对齐到UTF-8。

排查过程

先按常规思路配置Git和分页器:
  1. git config --global i18n.logoutputencoding utf-8
  2. git config --global core.pager "less -R"
复制代码

再把LESSCHARSET设为utf-8,并加入Windows系统环境变量,变量名为LESSCHARSET,值为utf-8,然后重启终端。结果依然乱码。

接着检查当前进程能否读到变量:
  1. $env:LESSCHARSET
复制代码

没有任何输出,说明变量没被当前进程读到。但换一种方式读注册表:
  1. [Environment]::GetEnvironmentVariable('LESSCHARSET','Machine')
复制代码

能正常输出utf-8。这里出现了关键矛盾:注册表里有,进程里没有。

根因在于Windows环境变量是进程启动时一次性继承的快照,之后注册表再改,已经运行的进程不会自动刷新。WebStorm内置终端更特殊,它继承的是WebStorm主进程启动时的环境快照。因此在Windows里新加系统变量后,只关闭内置终端再开一个没有用,新终端拿到的仍是WebStorm启动那一刻的旧环境,必须重启整个WebStorm,内置终端才可能拿到新变量。

在当前会话里临时设置变量可以验证:
  1. $env:LESSCHARSET = 'utf-8'
复制代码

再跑git log,中文正常。至此可以确认Git配置没有问题,问题纯粹是LESSCHARSET没有进入PowerShell进程。

最终方案

方案一(推荐):写入PowerShell Profile。它不依赖系统环境变量的传播机制,每次启动终端自动执行,最可控。打开Profile文件:
  1. notepad $PROFILE
复制代码

如果提示文件不存在,先创建:
  1. New-Item -Path $PROFILE -Type File -Force
  2. notepad $PROFILE
复制代码

粘贴以下内容并保存:
  1. $env:LESSCHARSET = 'utf-8'
  2. chcp 65001 > $null
  3. [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
  4. $OutputEncoding = [System.Text.Encoding]::UTF8
复制代码

第2~4项是辅助项。如果只保留$env:LESSCHARSET = 'utf-8',通常也能解决当前场景,但保留全部能让编码链更完整,避免输出重定向、管道等场景再次踩坑。

方案二:配套的Git全局配置。Profile解决的是进程内变量,Git侧的配置需要另外持久化写入全局.gitconfig:
  1. git config --global i18n.logoutputencoding utf-8
  2. git config --global core.pager "less -R"
  3. git config --global core.quotepath false
复制代码

第一条让git log以UTF-8输出日志内容;第二条使用less作为分页器,-R允许正确渲染颜色控制字符;第三条关闭路径转义,让中文文件名和路径直接显示,而不是显示成八进制转义码。这三条只需执行一次。

验证

让Profile立即生效,免开新窗口:
  1. . $PROFILE
复制代码

确认变量已加载:
  1. $env:LESSCHARSET
复制代码

确认控制台编码:
  1. [Console]::OutputEncoding
复制代码

应显示UnicodeEncoding(UTF-8),而不是gb2312或936。最后实际测试:
  1. git log -5
复制代码

分页正常工作,中文提交信息显示正常,即完成配置。

避坑提示

WebStorm内置终端必须重启WebStorm才会加载新的系统环境变量,只关终端窗口没用,因为它继承的是IDE主进程启动时的环境快照。这也是Profile方案更可靠的原因:每次终端启动都会执行,绕过了快照问题。

i18n.logoutputencoding并未被废弃。网上有说法称它在较新Git版本中弃用,但在Windows环境下它依然有效,是解决乱码的标准配置之一,可以保留。

系统环境变量与Profile的取舍:系统变量是全局但传播不可靠,Profile是局部但每次都生效。就个人开发场景而言,Profile更透明、更可复现,推荐优先使用。

core.quotepath false容易被忽略。它不解决提交信息乱码,但能解决中文文件名显示成八进制转义的问题,顺手加上体验会更好。

小结

Git输出层:i18n.logoutputencoding utf-8写入~/.gitconfig,让日志以UTF-8输出。
分页器层:core.pager "less -R"写入~/.gitconfig,保留分页与颜色。
路径显示层:core.quotepath false写入~/.gitconfig,让中文路径不转义。
less字符集:$env:LESSCHARSET = 'utf-8'写入$PROFILE,让less按UTF-8渲染。
控制台代码页:chcp 65001写入$PROFILE,把控制台切到UTF-8。
控制台与管道编码:[Console]::OutputEncoding和$OutputEncoding写入$PROFILE,端到端统一UTF-8。

核心思路一句话:让Git、less、PowerShell三端都对齐UTF-8,并把进程级变量写进Profile,绕开Windows环境变量传播不可靠的坑。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: git log中文乱码:PowerShell的less编码修复

这个排查思路很扎实,尤其是把“注册表里有、进程里没有”这个矛盾点抓住,一下就把问题从 Git 配置转移到环境变量传播机制上了,很多人卡在乱码上反复改 .gitconfig 就是因为没意识到这一层。 补充两个我踩过的相关点。一是 Profile 的路径分两个:PowerShell 5.1 和 PowerShell 7 的 `$PROFILE` 不是同一个文件,如果两个都常用,要么两边各写一遍,要么把变量写进 `$PROFILE.CurrentUserAllHosts`,这样 5.1 和 7 都能读到,省得以后在另一版 PowerShell 里又复现一次乱码。二是楼主说的“IDE 主进程快照”问题在 VS Code 集成终端里也一样存在,改完系统环境变量后只关终端标签页没效果,必须整个重启 VS Code 才能继承到新环境,所以 Profile 方案确实是更省心的那条路。 另外 `core.quotepath false` 这个顺手加的点很实用,它跟提交信息乱码完全无关,但中文路径显示成八进制转义的样子确实挺影响阅读的,很多人查日志时看到 `\344\270\255` 这种还得自己脑内解码。`less -R` 保留颜色这点也值得强调,光写 `less` 的话颜色控制符会被原样打出来,反而更乱。 总的来说三端对齐 UTF-8 加 Profile 落地的组合是可靠的,配置一次之后基本不用再
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: git log中文乱码:PowerShell的less编码修复

这篇排查写得很完整,尤其是“注册表里有 LESSCHARSET、当前进程却读不到”这一段,把 Windows 环境变量只在进程启动时继承快照的机制讲清楚了。很多人只改 Git 配置或者只重开终端窗口,在 WebStorm 内置终端里确实容易卡住,必须重启整个 IDE 这一点很关键。 把问题拆成 Git 输出、less 渲染、PowerShell 控制台三端对齐 UTF-8,这个思路很清楚。最终用 PowerShell Profile 写入 LESSCHARSET,再配合全局 .gitconfig 里的 i18n.logoutputencoding、core.pager 和 core.quotepath false,分工明确,也比依赖系统环境变量传播更可控。 验证部分也很实用,先 . $PROFILE 让配置立即生效,再确认 $envESSCHARSET 和输出编码,最后用 git log -5 实际测试,步骤很顺。core.quotepath false 这个点确实容易被忽略,虽然不解决提交信息乱码,但中文路径显示会舒服很多。感谢分享,后面遇到类似问题可以直接按这个方案排查。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: git log中文乱码:PowerShell的less编码修复

感谢分享,这篇排查过程写得很清楚,尤其是“环境变量是进程启动时快照”和 WebStorm 内置终端要重启整个 IDE 这两点,之前很容易被忽略。按你的思路,把 LESSCHARSET 写进 PowerShell Profile,再配合 git 的三条全局配置和 chcp 65001,确实比只改系统环境变量更可控、更容易复现。验证步骤也很实用,尤其是用 . $PROFILE 立即生效、再检查 $envESSCHARSET 和输出编码,能快速确认配置有没有真正进入当前会话。core.quotepath false 这个提醒也很好,中文路径显示问题顺手就解决了。收藏备用。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-27 21:16 , Processed in 0.024536 second(s), 28 queries , Gzip On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部