第15章 Git协议与工作协同

要想团队协作使用Git,就需要用到Git协议。

15.1 Git支持的协议

首先来看看数据交换需要使用的协议。

Git提供了丰富的协议支持,包括:SSH、GIT、HTTP、HTTPS、FTP、FTPS、RSYNC及前面已经看到的本地协议等。各种不同协议的URL写法如表15-1所示。

第15章 Git协议与工作协同 - 图1

上面介绍的各种协议可分为两类:智能协议和哑协议。

1.智能协议

在会话时使用智能协议,会在会话的两个版本库的各自一端打开相应的程序进行数据交换。使用智能协议最直观的印象就是在数据传输过程中会有清晰的进度显示,而且因为是按需传输所以传输量更小,速度更快。图15-1显示的就是在执行PULL和PUSH两个最常用的操作时,两个版本库各自启动辅助程序的情况。

第15章 Git协议与工作协同 - 图2

图 15-1 Git智能协议通信示意图

上述协议中SSH、GIT及本地协议(file://)属于智能协议。HTTP协议需要特殊的配置(用git-http-backend配置CGI),并且客户端需要使用Git 1.6.6或更高的版本才能够使用智能协议。

2.哑协议

和智能协议相对的是哑协议。在使用哑协议访问远程版本库的时候,远程版本库不会运行辅助程序,而是完全依靠客户端去主动“发现”。客户端需要访问文件.git/info/refs获取当前版本库的引用列表,并根据引用对应的提交ID直接访问对象库目录下的文件。如果对象文件被打包而不是以松散对象形式存在,则Git客户端还要去访问文件.git/objects/info/packs以获得打包文件列表,并据此读取完整的打包文件,从打包文件中获取对象。由此可见哑协议的效率非常之低,甚至会因为要获取一个对象而去访问整个pack包。

使用哑协议最直观的感受是:传输速度非常慢,而且传输进度不可见,不知道什么时候才能够完成数据传输。上述协议中,FTP和RSYNC都是哑协议,没有通过git-http-backend或类似CGI程序配置的HTTP服务器提供的也是哑协议。因为哑协议需要索引文件.git/info/refs和.git/objects/info/packs以获取引用和包列表,因此要在版本库的钩子脚本post-update中设置运行git update-server-info以确保及时更新哑协议需要的索引文件。不过如果不使用哑协议,运行git update-server-info就没有什么必要了。

以Git项目本身为例,看看如何使用不同的协议地址进行版本库克隆。

GIT协议(智能协议):


$git clone git://git.kernel.org/pub/scm/git/git.git


HTTP(S)哑协议:


$git clone http://www.kernel.org/pub/scm/git/git.git


HTTP(S)智能协议[1]


$git clone https://github.com/git/git.git


[1]使用Git 1.6.6或更高版本访问。