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。