8.1.1. 字符集问题

在本书第1篇“第3章安装Git”中,就已经详细介绍了不同平台对本地字符集(如中文)的支持情况,本章再做以简单的概述。

Linux、Mac OS X以及Windows下的Cygwin缺省使用UTF-8字符集。Git运行这这些平台下,能够使用本地语言(如中文)写提交说明、命名文件,甚至使用本地语言命名分支和里程碑。在这些平台上唯一要做的就是对Git进行如下设置,以便使用了本地语言(如中文)命名文件时,能够在状态查看、差异比较时,正确显示文件名。

$ git config --global core.quotepath false

但是如果在Windows平台使用msysGit或者其他平台使用了非UTF-8字符集,要想使用本地语言撰写提交说明、命名文件名和目录名就非常具有挑战性了。例如对于使用GBK字符集的中文Windows,需要为Git进行如下设置,以便能够在提交说明中正确使用中文。

$ git config --system core.quotepath false
$ git config --system i18n.commitEncoding gbk
$ git config --system i18n.logOutputEncoding gbk

当像上面那样对i18n.commitEncoding进行设置后,如果执行提交,就会在提交对象中嵌入编码设置的指令。例如在Windows中使用msysGit执行一次提交,在Linux上使用git cat-file命令查看提交时会出现乱码,需要使用iconv命令对输出进行字符集转换才能正确查看该提交对象。下面输出的倒数第三行可以看到encoding gbk这条对字符集设置的指令。

$ git cat-file -p HEAD | iconv -f gbk -t utf-8
tree 00e814cda96ac016bcacabcf4c8a84156e304ac6
parent 52e6454db3d99c85b1b5a00ef987f8fc6d28c020
author Jiang Xin <jiangxin@ossxp.com> 1297241081 +0800
committer Jiang Xin <jiangxin@ossxp.com> 1297241081 +0800
encoding gbk

添加中文说明。

因为在提交对象中声明了正确的字符集,因此Linux下可以用git log命令正确显示msysGit生成的包含中文的提交说明。

但是对于非UTF-8字符集平台(如msysGit)下,使用本地字符(如中文)命名文件或目录,Git当前版本(1.7.4)的支持尚不完善。文件名和目录名实际上是写在树对象中的,Git没能在创建树对象时,将本地字符转换为UTF-8字符进行保存,因而在跨平台时造成文件名乱码。例如下面的示例显示的是在Linux平台(UTF-8字符集)下查看由msysGit提交的包含中文文件的树对象。注意要在git cat-file命令的后面通过管道符号调用iconv命令进行字符转换,否则不能正确地显示中文。如果直接在Linux平台检出,检出的文件名显示为乱码。

$ git cat-file -p HEAD^{tree} | iconv -f gbk -t utf-8
100644 blob 8c0b112f56b3b9897007031ea38c130b0b161d5a    说明.txt