Git协议是提供Git版本库只读服务的最为常用的协议,也是非常易用和易于配置的协议。该协议的缺点就是不能提供身份认证,而且一般也不提供写入服务。
Git协议的语法格式如下。
语法: git://<server>[:<port>]/path/to/repos.git/
说明:
Git服务由名为git-daemon的服务软件提供。虽然git-daemon也可以支持写操作,但因为git-daemon没有提供认证支持,因此没有人胆敢配置git-daemon提供匿名的写服务。使用git-daemon提供的Git版本库的只读服务,效率很高,而且是一种智能协议,在操作过程有进度显示,远比HTTP哑通讯协议方便(Git 1.6.6之后的版本已经支持智能HTTP通讯协议)。因此git-daemon很久一来,一直是Git版本库只读服务的首选。
Git软件包本身提供了git-daemon,因此只要安装了Git,一般就已经安装了git-daemon。默认git-daemon并没有运行,需要对其进行配置以服务方式运行。下面介绍两种不同的配置运行方式。
最简单的方式,是以inetd服务方式运行git-daemon。在配置文件/etc/inetd.conf中添加设置如下:
git stream tcp nowait nobody /usr/bin/git
git daemon --inetd --verbose --export-all
/gitroot/foo /gitroot/bar
说明:
以nobody用户身份执行git daemon服务。
缺省git daemon只对包含文件git-daemon-export-ok的版本库提供服务。使用参数--export-all后,无论版本库是否存在标识文件git-daemon-export-ok,都对版本库提供Git协议支持。
后面的两个参数是版本库。
也可以通过--base-path=<path>参数,设置版本库的根,对于这个目录下的所有版本库提供访问服务。例如下面的inetd配置:
git stream tcp nowait nobody /usr/bin/git
git daemon --inetd --verbose --export-all
--base-path=/var/cache /var/cache/git
runit是类似于sysvinit的服务管理进程,但是更简单。在Debian/Ubuntu上的软件包git-daemon-run就是基于runit启动git-daemon服务。
安装git-daemon-run:
$ sudo aptitude install git-daemon-run
配置git-daemon-run:
缺省的服务配置文件:/etc/sv/git-daemon/run。和之前的inetd运行方式相比,以独立的服务进程启动,相应速度更快。
#!/bin/sh
exec 2>&1
echo 'git-daemon starting.'
exec chpst -ugitdaemon \
"$(git --exec-path)"/git-daemon --verbose --export-all --base-path=/var/cache /var/cache/git
缺省版本库中需要存在文件git-daemon-export-ok,git-daemon才对此版本库提供服务。不过可以通过启动git-daemon时提供的参数--export-all,无论版本库是否存在标识文件git-daemon-export-ok,都对版本库提供Git协议支持。
通过git-daemon提供的Git访问协议存在着局限性: