第40章 跨平台操作Git
您是在什么平台(操作系统)中使用Git呢?图40-1是网上发布的一个Git使用平台调查结果的截图[1],从中可以看出排在前三位的是:Linux、Mac OS X和Windows。而Windows用户中又以使用msysGit的用户居多。
图 40-1 Git用户操作系统使用分布图
在如今手持设备争夺激烈的年代,在什么操作系统上进行软件开发工作已经变得不那么重要了,很多手持设备都提供可以运行在各种主流操作系统上的虚拟器,因此一个项目团队的成员根据各自的使用习惯,可能使用不同的操作系统。当一个团队中不同的成员在不同的平台中使用Git进行交互时,可能会遇到平台兼容性的问题。
即使团队成员都在同一种操作系统上工作(如Windows),但Git服务器可能架设在另外的平台上(如Linux),或者产品的源代码被分发到另外的平台上进行编译、部署,同样都会遇到平台兼容性的问题。
40.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