如何解决Linux机器Git日志消息及软链接显示乱码问题
问题产生原因
该问题和Git仓库数据、软链接文件本身完全无关,所有异常仅出现在本地终端的输出渲染环节,核心诱因是本地系统locale(字符编码)配置错误/损坏:
- 当系统配置的locale(比如常见的
en_US.UTF-8)没有实际生成、或者系统声明的字符编码和终端实际使用的编码不匹配时,glibc的多字节字符处理逻辑会把行尾的单字节控制符(换行符、格式控制符等)误判为UTF-8多字节字符的首字节,继续向后读取内存中相邻的随机字节拼接显示,就会出现你看到的行尾固定位置多出2-4个随机乱码的现象,乱码内容可能每次略有区别。 - 因为数据本身没有损坏,所以换其他机器读取Git仓库、读取软链接真实指向(比如执行
readlink libnames.so)都会得到正常结果。
注意:不要尝试修改Git提交记录、重建软链接,这类操作完全无效。
解决步骤
- 确认locale配置异常
执行如下命令查看当前locale状态:
如果输出中出现localeCannot set LC_* to default locale: No such file or directory类的报错,即可确认是locale配置缺失导致的问题。 - 临时验证修复
先查看系统当前已经生成的可用locale列表:
从列表中选择匹配终端编码的可用locale(一般选带utf8后缀的英文或中文locale即可,比如locale -aen_US.utf8、zh_CN.utf8),在当前shell执行导出命令临时生效:
执行完成后重新运行export LANG=en_US.utf8 export LC_ALL=en_US.utf8git log、ls -l查看软链接,如果乱码消失,即可确认根因判断正确。 - 永久修复配置
- Debian/Ubuntu系:执行
sudo dpkg-reconfigure locales,在配置界面勾选你需要的UTF-8 locale(比如en_US.UTF-8 UTF-8、zh_CN.UTF-8 UTF-8),确认后选择对应locale作为系统默认,系统会自动生成缺失的locale文件,重新登录shell即可永久生效。 - RHEL/CentOS/Rocky系:先安装缺失的语言包
sudo yum install -y glibc-langpack-en glibc-langpack-zh,之后执行sudo localectl set-locale LANG=en_US.utf8写入全局配置,重新登录即可。
- Debian/Ubuntu系:执行
- 极端场景排查
如果修正locale后问题依然存在,排查是否有错误的动态库劫持:
如果上述两个位置存在非你手动配置的未知动态库,删除/注释对应配置,重新登录shell即可。也可以通过系统包管理器的校验功能检查核心库是否损坏:RPM系执行echo $LD_PRELOAD cat /etc/ld.so.preloadsudo rpm -V glibc coreutils git,DEB系执行sudo dpkg -V libc6 coreutils git,如果校验出文件损坏,重新安装对应软件包即可恢复。
内容的提问来源于stack exchange,提问作者hamasir
相关产品推荐
相关产品推荐

