Skip to content

Git 命令中文乱码的解决方案

文档兼容性

主体版本号文档地址(如果有)
gitgit version 2.32.1 (Apple Git-133)Git (git-scm.com)

说明

在使用 simple-git npm 库调用 Git 命令的子命令 git status 或者是 git diff-tree 时候会出现中文文件名乱码的情况:

比如:

  1. 获取包含中文文件名的提交记录哈希
shell
$ git log --online
9ae153c (HEAD -> main, origin/main, origin/HEAD) chore: 将所有内部链接转换为 Markdown 链接
  1. 使用查询到的 9ae153c 提交哈希进行 diff-tree 操作:
shell
$ git diff-tree --no-commit-id --name-only -r 9ae153c
"\342\232\240\357\270\217 \347\237\245\350\257\206\345\272\223\351\241\273\347\237\245.md"

可以发现返回的数据中包含了 \342\232\240\357\270\217 \347\237\245\350\257\206\345\272\223\351\241\273\347\237\245.md 这样的乱码字符串,或者我们说出现了 \xxx\xxx\xxx 这样的乱码。

原因

出现这个问题的原因是因为 Git 命令全局配置下有一个名为 core.quotepath 的选项默认值为 true,这将导致 Git 命令会将「不寻常」的字符通过包裹双引号和反斜杠进行转译[1]。将 core.quotepath 选项配置为 false 之后其将不会对高于 0x80(大于 ASCII 码表最大值 0x7E[2])的字符进行转译,而是选择全部逐字输出。

解决

在命令行程序中使用下面的命令进行配置:

shell
git config --global core.quotepath false

参考资料

贡献者

页面历史


  1. core.quotepath. The commands that output paths (e.g. ls-filesdiff), when not given the -z option, will quote "unusual" characters in the pathname by enclosing the pathname in a double-quote pair and with backslashes, the same way strings in the C source code are quoted. From git-config(1) - Linux man page ↩︎

  2. ASCII - Wikipedia ↩︎

撰写