运行在Cygwin下的Git不是直接使用Windows的系统调用,而是通过二传手cygwin1.dll来进行,虽然Cygwin的git命令能够在Windows下的cmd.exe命令窗口中运行的非常好,但Cygwin下的Git并不能看作是Windows下的原生程序。相比Cygwin下的Git,msysGit是原生的Windows程序,msysGit下运行的Git直接通过Windows的系统调用运行。
msysGit的名字前面的四个字母来源于MSYS项目。MSYS项目源自于MinGW(Minimalist GNU for Windows,最简GNU工具集),通过增加了一个bash提供的shell环境以及其他相关工具软件,组成了一个最简系统(Minimal SYStem),简称MSYS。利用MinGW提供的工具,以及Git针对MinGW的一个分支版本,在Windows平台为Git编译出一个原生应用,结合MSYS就组成了msysGit。
安装msysGit非常简单,访问msysGit的项目主页(http://code.google.com/p/msysgit/),下载msysGit。最简单的方式是下载名为Git-<VERSION>-preview<DATE>.exe的软件包,如:Git-1.7.3.1-preview20101002.exe。如果有时间和耐心,喜欢观察Git是如何在Windows上是编译为原生应用的,也可以下载带msysGit-fullinstall-前缀的软件包。
点击下载的安装程序(如Git-1.7.3.1-preview20101002.exe),开始安装,如图3-18。
默认安装到C:\Program Files\Git目录中。
在安装过程中会询问是否修改环境变量,如图3-20。默认选择“Use Git Bash Only”,即只在msysGit提供的shell环境(类似Cygwin)中使用Git,不修改环境变量。注意如果选择最后一项,会将msysGit所有的可执行程序全部加入Windows的PATH路径中,有的命令会覆盖Windows相同文件名的程序(如find.exe和sort.exe)。而且如果选择最后一项,还会为Windows添加HOME环境变量,如果安装有Cygwin,Cygwin会受到msysGit引入的HOME环境变量的影响(参见前面3.3.3节的相关讨论)。
还会询问换行符的转换方式,使用默认设置就好。参见图3-21。关于换行符转换,参见本书第8篇相关章节。
根据提示,完成msysGit的安装。
完成msysGit的安装后,点击Git Bash图标,启动msysGit,如图3-22。会发现Git Bash 的界面和Cygwin的非常相像。
在msysGit下访问Windows的各个盘符,要比Cygwin简单,直接通过/c即可访问Windows的C:盘,用/d访问Windows的D:盘。
$ ls -ld /c/Windows
drwxr-xr-x 233 jiangxin Administ 0 Jan 31 00:44 /c/Windows
至于msysGit的根目录,实际上就是msysGit安装的目录,如:“C:\Program Files\Git”。
msysGit缺省已经安装了Git的命令补齐功能,并且在对文件名命令补齐时忽略大小写。这是因为msysGit已经在配置文件/etc/inputrc中包含了下列的设置:
set completion-ignore-case on
在介绍Cygwin的章节中曾经提到过,msysGit的shell环境的中文支持相当于老版本的Cygwin,需要配置才能够实现录入中文和显示中文。
缺省安装的msysGit的shell环境无法输入中文。为了能在shell界面中输入中文,需要修改配置文件/etc/inputrc,增加或修改相关配置如下:
# disable/enable 8bit input
set meta-flag on
set input-meta on
set output-meta on
set convert-meta off
关闭Git Bash再重启,就可以在msysGit的shell环境中输入中文了。
$ echo 您好
您好
当对/etc/inputrc进行正确的配置之后,能够在shell下输入中文,但是执行下面的命令会显示乱码。这显然是less分页器命令导致的问题。
$ echo 您好 | less
<C4><FA><BA><C3>
通过管道符调用分页器命令less后,原本的中文输出变成了乱码显示。这将会导致Git很多命令的输出都会出现中文乱码问题,因为Git大量的使用less命令做为分页器。之所以less命令出现乱码,是因为该命令没有把中文当作正常的字符,可以通过设置LESSCHARSET环境变量,将utf-8编码字符视为正规字符显示,则中文就能正常显示了。下面的操作,可以在less分页器中正常显示中文。
$ export LESSCHARSET=utf-8
$ echo 您好 | less
您好
编辑配置文件/etc/profile,将对环境变量LESSCHARSET的设置加入其中,以便msysGit的shell环境一启动即加载。
declare -x LESSCHARSET=utf-8
最常用的显示目录和文件名列表的命令ls对中文文件名的显示有问题。下面的命令创建了一个中文文件名的文件,显示文件内容中的中文没有问题,但是显示文件名本身会显示为一串问号。
$ echo 您好 > 您好.txt
$ cat \*.txt
您好
$ ls \*.txt
????.txt
实际上只要在ls命令后添加参数–show-control-chars即可正确显示中文。
$ ls --show-control-chars *.txt
您好.txt
为方便起见,可以为ls命令设置一个别名,这样就不必在输入ls命令时输入长长的参数了。
$ alias ls="ls --show-control-chars"
$ ls \*.txt
您好.txt
将上面的alias命令添加到配置文件/etc/profile中,实现在每次运行Git Bash时自动加载。
非常遗憾的是msysGit中的Git对中文支持没有Cygwin中的Git做的那么好,msysGit中的Git对中文支持的程度,就相当于前面讨论过的Linux使用了GBK字符集时Git的情况。
如果希望版本库中出现使用中文文件名的文件,最好不要使用msysGit,而是使用Cygwin下的Git。而如果只是想在提交说明中使用中文,经过一定的设置msysGit还是可以实现的。
为了解决提交说明显示乱码问题,msysGit要为Git设置参数i18n.logOutputEncoding,将提交说明的输出编码设置为gbk。
$ git config --system i18n.logOutputEncoding gbk
Git在提交时并不会对提交说明进行从GBK字符集到UTF-8的转换,但是可以在提交说明中标注所使用的字符集,因此在非UTF-8字符集的平台录入中文,需要用下面指令设置录入提交说明的字符集,以便在commit对象中嵌入正确的编码说明。为了使msysGit提交时输入的中文说明能够在Linux或其他使用UTF-8编码的平台中正确显示,还必须对参数i18n.commitEncoding设置。
$ git config --system i18n.commitEncoding gbk
同样,为了能够让带有中文文件名的文件,在工作区状态输出、查看历史更改概要、以及在补丁文件中,能够正常显示,要为Git配置core.quotepath变量,将其设置为false。但是要注意在msysGit中添加中文文件名的文件,只能在msysGit环境中正确显示,而在其他环境(Linu、Mac OS X、Cygwin)中文件名会出现乱码。
$ git config --system core.quotepath false
$ git status -s
?? 说明.txt
注意:如果同时安装了Cygwin和msysGit(可能配置了相同的用户主目录),或者因为中文支持问题而需要单独为TortoiseGit准备一套msysGit时,为了保证不同的msysGit之间,以及和Cygwin之间的配置不会互相影响,而在配置Git环境时使用–system参数。这是因为不同的msysGit安装以及Cygwin有着不同的系统配置文件,但是用户级配置文件位置却可能重合。
msysGit软件包包含的ssh命令和Linux下的没有什么区别,也提供ssh-keygen命令管理SSH公钥/私钥对。在使用msysGit的ssh命令时,没有遇到Cygwin中的ssh命令(版本号:5.7p1-1)不稳定的问题,即msysGit下的ssh命令可以非常稳定的工作。
如果需要和Windows有更好的整合,希望使用图形化工具管理公钥,也可以使用PuTTY提供的plink.exe做为SSH客户端。关于如何使用PuTTY可以参见3.3.5节Cygwin和PuTTY整合的相关内容。
TortoiseGit提供了Git和Windows资源管理器的整合,提供了Git的图形化操作界面。像其他Tortoise系列产品(TortoiseCVS、TortoiseSVN)一样,Git工作区的目录和文件的图标附加了标识版本控制状态的图像,可以非常直观的看到哪些文件被更改了需要提交。通过对右键菜单的扩展,可以非常方便的在资源管理器中操作Git版本库。
TortoiseGit是对msysGit命令行的封装,因此需要先安装msysGit。安装TortoiseGit非常简单,访问网站http://code.google.com/p/tortoisegit/,下载安装包,然后根据提示完成安装。
安装过程中会询问要使用的SSH客户端,如图3-23。缺省使用内置的TortoisePLink(来自PuTTY项目)做为SSH客户端。
TortoisePLink和TortoiseGit的整合性更好,可以直接通过对话框设置SSH私钥(PuTTY格式),而无需再到字符界面去配置SSH私钥和其他配置文件。如果安装过程中选择了OpenSSH,可以在安装完毕之后,通过TortoiseGit的设置对话框重新选择TortoisePLink做为缺省SSH客户端程序,如图3-24。
当配置使用TortoisePLink做为缺省SSH客户端时,在执行克隆操作时,在操作界面中可以选择一个PuTTY格式的私钥文件进行认证,如图3-25。
如果连接一个服务器的SSH私钥需要更换,可以通过Git远程服务器配置界面对私钥文件进行重新设置。如图3-26。
如果安装有多个msysGit拷贝,也可以通过TortoiseGit的配置界面进行选择,如图3-27。
TortoiseGit虽然在底层调用了msysGit,但是TortoiseGit的中文支持和msysGit有区别,甚至前面介绍msysGit中文支持时所进行的配制会破坏TortoiseGit。
TortoiseGit在提交时,会将提交说明转换为UTF-8字符集,因此无须对i18n.commitEncoding变量进行设置。相反,如果设置了i18n.commitEncoding为gbk或其他,则在提交对象中会包含错误的编码设置,有可能为提交说明的显示带来麻烦。
TortoiseGit在显示提交说明时,认为所有的提交说明都是UTF-8编码,会转换为合适的Windows本地字符集显示,而无须设置i18n.logOutputEncoding变量。因为当前版本的TortoiseGit没有对提交对象中的encoding设置进行检查,因此使用GBK字符集的提交说明中的中文不能正常显示。
因此,如果需要同时使用msysGit的文字界面Git Bash以及TortoiseGit,并需要在提交说明中使用中文,可以安装两套msysGit,并确保TortoiseGit关联的msysGit没有对i18n.commitEncoding进行设置。
TortoiseGit对使用中文命名的文件和目录的支持和msysGit一样,都存在缺陷,因此应当避免在msysGit和TortoiseGit中添加用中文命名的文件和目录,如果确实需要,可以使用Cygwin。