目录

'git status' 输出中中文文件名显示问题

问题描述

最近新建了一些中文名文件,在使用git status命令中偶然发现,输出的结果中无法显示这些中文文件名:

/2020/solve_chinese_file_name_displaying_issue_in_git/git_status_output.png
git status 输出

Git 的版本是2.24.4。

 

解决方案

查了一下,所用的 Centos 系统的字符集是UTF-8:

/2020/solve_chinese_file_name_displaying_issue_in_git/check_current_charset.png
查看当前字符集

一般 Linux 平台的默认字符集都是UTF-8,Git 大部分的命令在UTF-8下都工作的很好,比如提交修改时,commit message 就可以用中文;显示 commit 历史,也能正常显示中文。但是git status命令下,中文文件名就无法正常显示。

其实,上面显示的是中文名的八进制的字符编码,你如果用printf命令是可以正常打印出来的:

/2020/solve_chinese_file_name_displaying_issue_in_git/print_chinese_file_name.png
用printf打印文件名

上 Google 查了一下,发现 Git 的配置中有一项配置和如何显示文件路径有关:

core.quotePath

Commands that output paths (e.g. ls-files, diff), will quote “unusual” characters in the pathname by enclosing the pathname in double-quotes and escaping those characters with backslashes in the same way C escapes control characters (e.g. \t for TAB, \n for LF, \\ for backslash) or bytes with values larger than 0x80 (e.g. octal \302\265 for “micro” in UTF-8). If this variable is set to false, bytes higher than 0x80 are not considered “unusual” any more. Double-quotes, backslash and control characters are always escaped regardless of the setting of this variable. A simple space character is not considered “unusual”. Many commands can output pathnames completely verbatim using the -z option. The default value is true.

简单地说,当 Git 命令的输出中会显示文件的路径时(比如 status、ls-file、diff 等命令),路径中如果有转义字符,或者 UTF-8 编码值大于 0x80的字节,整个文件路径会被放在引号中,并显示这些转义字符或 UTF-8 编码值。这个选项默认是打开的,换句话说,如果路径中有中文,它显示的是中文的 UTF-8 编码值。所以,要想正常显示中文,只要把这个选项设为 false 即可。

用 root 身份(或sudo)打开/etc/gitconfig,加入设置项:

1
2
[core]
	quotepath = false

保存即可。该设置对所有用户有效。

 

参考

https://git-scm.com/docs/git-config


- 全文完 -

「 您的赞赏是激励我创作和分享的最大动力! 」