27.2 智能HTTP协议

Git 1.6.6之后的版本提供了针对HTTP协议的CGI程序git-http-backend,实现了智能的HTTP协议支持。但同时要求Git客户端的版本不低于1.6.6。

查看文件git-http-backend的安装位置,可以用如下命令。


$ls$(git—exec-path)/git-http-backend

/usr/lib/git-core/git-http-backend


更改Apache的配置文件,以使用CGI提供智能Git访问服务。相关的Apache配置如下:


SetEnv GIT_PROJECT_ROOT/path/to/repos

SetEnv GIT_HTTP_EXPORT_ALL

ScriptAlias/git//usr/lib/git-core/git-http-backend/


说明:

第一行设置版本库的根目录为/path/to/repos。

第二行设置所有版本库均可访问,无论在版本库中是否存在git-daemon-export-ok文件。

默认只有在版本库目录中存在git-daemon-export-ok文件时,该版本库才可以访问。这个文件是git-daemon服务的一个特性。

第三行,就是使用名为git-http-backend的CGI脚本来响应客户端的请求。当访问http://server/git/myrepos.git时,即由此CGI提供服务。

1.写操作授权

上面的配置只能提供版本库的读取服务,若想提供基于HTTP协议的写操作,必须添加认证配置指令。用户通过认证后才能对版本库进行写操作。

下面的Apache配置中,在前面配置的基础上为Git写操作提供授权:


<LocationMatch "^/git/.*/git-receive-pack$">

AuthType Basic

AuthName "Git Access"

AuthBasicProvider file

AuthUserFile/path/to/passwd/file

</LocationMatch>


2.读和写均需授权

如果需要对读操作也进行授权,那就更简单了。下面的配置通过一个Location语句实现了对路径/path/private下版本库的读写授权。


<Location/git/private>

AuthType Basic

AuthName "Git Access"

AuthBasicProvider file

AuthUserFile/path/to/passwd/file

</Location>


3.对静态文件的直接访问

如果对静态文件的访问不经过CGI程序,直接由Apache提供服务,会提高访问性能。

下面的Apache配置设置了直接通过Apache(绕过CGI)访问Git版本库中对象库下的文件。


SetEnv GIT_PROJECT_ROOT/path/to/repos

AliasMatch^/git/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$/path/to/repos/$1

AliasMatch^/git/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$/path/to/repos/$1

ScriptAlias/git//usr/libexec/git-core/git-http-backend/


Git的智能HTTP服务彻底打破了以前哑传输协议给HTTP协议带来的恶劣印象,让HTTP协议成为Git服务的一个重要选项。但是在授权的管理上,智能HTTP服务仅仅依赖Apache自身的授权模型,相比后面要介绍的Gitosis和Gitolite,可管理性要弱得多。表现如下:

创建版本库只能在服务器端进行,不能通过远程客户端进行。

配置认证和授权,也只能在服务器端进行,不能在客户端远程配置。

版本库的写操作授权只能进行非0即1的授权,不能针对分支甚至路径进行授权。

如果需要企业级的版本库管理,可以考虑后面介绍的基于SSH协议的Gitolite或Gitosis。