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。