1.3.4. Windows下安装和使用Git(msysGit篇)

运行在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。

1.3.4.1. 安装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。

../_images/msysgit-1.png

图3-18:启动msysGit安装

默认安装到C:\Program Files\Git目录中。

../_images/msysgit-3.png

图3-19:选择msysGit的安装目录

在安装过程中会询问是否修改环境变量,如图3-20。默认选择“Use Git Bash Only”,即只在msysGit提供的shell环境(类似Cygwin)中使用Git,不修改环境变量。注意如果选择最后一项,会将msysGit所有的可执行程序全部加入Windows的PATH路径中,有的命令会覆盖Windows相同文件名的程序(如find.exesort.exe)。而且如果选择最后一项,还会为Windows添加HOME环境变量,如果安装有Cygwin,Cygwin会受到msysGit引入的HOME环境变量的影响(参见前面3.3.3节的相关讨论)。

../_images/msysgit-6.png

图3-20:是否修改系统的环境变量

还会询问换行符的转换方式,使用默认设置就好。参见图3-21。关于换行符转换,参见本书第8篇相关章节。

../_images/msysgit-8.png

图3-21:换行符转换方式

根据提示,完成msysGit的安装。

1.3.4.2. msysGit的配置和使用

完成msysGit的安装后,点击Git Bash图标,启动msysGit,如图3-22。会发现Git Bash 的界面和Cygwin的非常相像。

../_images/msysgit-startup.png

图3-22:启动Git Bash

1.3.4.2.1. 如何访问Windows的磁符

在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”。

1.3.4.2.2. 命令行补齐和忽略文件大小写

msysGit缺省已经安装了Git的命令补齐功能,并且在对文件名命令补齐时忽略大小写。这是因为msysGit已经在配置文件/etc/inputrc中包含了下列的设置:

set completion-ignore-case on

1.3.4.3. msysGit的shell环境的中文支持

在介绍Cygwin的章节中曾经提到过,msysGit的shell环境的中文支持相当于老版本的Cygwin,需要配置才能够实现录入中文和显示中文。

1.3.4.3.1. 中文录入问题

缺省安装的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 您好
您好

1.3.4.3.2. 分页器中文输出问题

当对/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

1.3.4.3.3. ls命令对中文文件名的显示

最常用的显示目录和文件名列表的命令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时自动加载。

1.3.4.4. msysGit中Git的中文支持

非常遗憾的是msysGit中的Git对中文支持没有Cygwin中的Git做的那么好,msysGit中的Git对中文支持的程度,就相当于前面讨论过的Linux使用了GBK字符集时Git的情况。

  • 未经配置的msysGit提交时,如果在提交说明中输入中文,从Linux平台或其他UTF-8字符集平台上查看提交说明显示乱码。
  • 同样从Linux平台或者其他使用UTF-8字符集平台进行的提交,若提交说明包含中文,在未经配置的msysGit中也显示乱码。
  • 如果使用msysGit向版本库中添加带有中文文件名的文件,在Linux(或其他utf-8)平台检出文件名显示为乱码。反之亦然。
  • 不能创建带有中文字符的引用(里程碑、分支等)。

如果希望版本库中出现使用中文文件名的文件,最好不要使用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有着不同的系统配置文件,但是用户级配置文件位置却可能重合。

1.3.4.5. 使用SSH协议

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整合的相关内容。

1.3.4.6. TortoiseGit的安装和使用

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客户端。

../_images/tgit-3.png

图3-23:启动Git Bash

TortoisePLink和TortoiseGit的整合性更好,可以直接通过对话框设置SSH私钥(PuTTY格式),而无需再到字符界面去配置SSH私钥和其他配置文件。如果安装过程中选择了OpenSSH,可以在安装完毕之后,通过TortoiseGit的设置对话框重新选择TortoisePLink做为缺省SSH客户端程序,如图3-24。

../_images/tgit-settings-network-plink.png

图3-24:配置缺省SSH客户端

当配置使用TortoisePLink做为缺省SSH客户端时,在执行克隆操作时,在操作界面中可以选择一个PuTTY格式的私钥文件进行认证,如图3-25。

../_images/tgit-clone.png

图3-25:克隆操作选择PuTTY格式私钥文件

如果连接一个服务器的SSH私钥需要更换,可以通过Git远程服务器配置界面对私钥文件进行重新设置。如图3-26。

../_images/tgit-settings-remote.png

图3-26:更换连接远程SSH服务器的私钥

如果安装有多个msysGit拷贝,也可以通过TortoiseGit的配置界面进行选择,如图3-27。

../_images/tgit-settings-general.png

图3-27:配置msysGit的可执行程序位置

1.3.4.7. TortoiseGit的中文支持

TortoiseGit虽然在底层调用了msysGit,但是TortoiseGit的中文支持和msysGit有区别,甚至前面介绍msysGit中文支持时所进行的配制会破坏TortoiseGit。

TortoiseGit在提交时,会将提交说明转换为UTF-8字符集,因此无须对i18n.commitEncoding变量进行设置。相反,如果设置了i18n.commitEncodinggbk或其他,则在提交对象中会包含错误的编码设置,有可能为提交说明的显示带来麻烦。

TortoiseGit在显示提交说明时,认为所有的提交说明都是UTF-8编码,会转换为合适的Windows本地字符集显示,而无须设置i18n.logOutputEncoding变量。因为当前版本的TortoiseGit没有对提交对象中的encoding设置进行检查,因此使用GBK字符集的提交说明中的中文不能正常显示。

因此,如果需要同时使用msysGit的文字界面Git Bash以及TortoiseGit,并需要在提交说明中使用中文,可以安装两套msysGit,并确保TortoiseGit关联的msysGit没有对i18n.commitEncoding进行设置。

TortoiseGit对使用中文命名的文件和目录的支持和msysGit一样,都存在缺陷,因此应当避免在msysGit和TortoiseGit中添加用中文命名的文件和目录,如果确实需要,可以使用Cygwin。