第30章 Gitolite服务架设

Gitolite是一款Perl语言开发的Git服务管理工具,通过公钥对用户进行认证,并能够通过配置文件对写操作进行基于分支和路径的精细授权。Gitolite采用的是SSH协议并且使用SSH公钥认证,因此无论是管理员还是普通用户,都需要对SSH非常熟悉。在开始之前,请确认您已经通读过第29章“使用SSH协议”。

Gitolite的官方网址是:http://github.com/sitaramc/gitolite。从提交日志里可以看出作者是Sitaram Chamarty,最早的提交开始于2009年8月。作者是受到了Gitosis的启发,开发了这款功能更为强大和易于安装的软件。Gitolite的命名,作者的原意是Gitosis和lite的组合,不过因为Gitolite的功能越来越强大,已经超越了Gitosis,因此作者笑称Gitolite可以看作是Github-lite——轻量级的Github。

我是在2010年8月才发现Gitolite这个项目的,并尝试将公司基于Gitosis的管理系统迁移至Gitolite。在迁移和使用过程中,增加和改进了一些实现,如:通配符版本库的创建过程,对创建者的授权,版本库名称映射等。本文关于Gitolite的介绍也是基于我改进的版本[1]

原作者的版本库地址:

http://github.com/sitaramc/gitolite

笔者改进后的Gitolite分支:

http://github.com/ossxp-com/gitolite

Gitolite的实现机制和使用特点概述如下:

Gitolite安装在服务器(server)的某个账号之下,例如git账号。

管理员通过git命令检出名为gitolite-admin的版本库。


$git clone git@server:gitolite-admin.git


管理员将Git用户的公钥保存在gitolite-admin库的keydir目录下,并编辑conf/gitolite.conf文件为用户授权。

当管理员提交对gitolite-admin库的修改并推送到服务器之后,服务器上gitolite-admin版本库的钩子脚本将执行相应的设置工作。

〇新用户的公钥自动追加到服务器端安装账号主目录下的.ssh/authorized_

keys文件中,并设置该用户的shell为gitolite的一条命令gl-auth-command。在.ssh/authorized_keys文件中增加的内容示例如下:


command="/home/git/.gitolite/src/gl-auth-command

jiangxin",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-

pty ssh-rsa AAAAB3NzaC1yc2…(公钥内容来自于jiangxin.pub)…[2]


〇更新服务器端的授权文件~/.gitolite/conf/gitolite.conf。

〇编译授权文件为~/.gitolite/conf/gitolite.conf-compiled.pm。

若用ssh命令登录服务器(以Git用户登录)时,因为公钥认证的相关设置(使用gl-auth-command作为shell),不能进入shell环境,而是打印服务器端Git库授权信息后马上退出。即用户不会通过Git用户进入服务器的shell,也不会对系统的安全造成威胁。


$ssh git@bj

hello jiangxin,the gitolite version here is v1.5.5-9-g4c11bd8

the gitolite config gives you the following access:

R gistore-bj.ossxp.com/.*$

C R W ossxp/.*$

@C@R W users/jiangxin/.+$

Connection to bj closed.


用户可以用git命令访问授权的版本库。

若管理员授权,用户可以远程在服务器上创建新版本库。

下面介绍Gitolite的部署和使用。在下面的示例中约定:服务器的名称为server,Gitolite的安装账号为git,管理员的ID为admin。

30.1 安装Gitolite

Gitolite要求Git的版本必须是1.6.2或以上的版本,并且服务器要提供SSH服务。下面是Gitolite的安装过程。

30.1.1 服务器端创建专用账号

安装Gitolite,首先要在服务器端创建专用账号,所有用户都通过此账号访问Git库。一般为方便易记,选择git作为专用账号名称。


$sudo adduser—system—shell/bin/bash—group git


创建用户git,并设置用户的shell为可登录的shell,如/bin/bash,同时添加同名的用户组。

有的系统,只允许特定用户组(如ssh用户组)的用户才可以通过SSH协议登录,这就需要将新建的git用户同时也添加到该特定的用户组中。执行下面的命令可以将git用户添加到ssh用户组。


$sudo adduser git ssh


为git用户设置口令。当整个git服务配置完成,运行正常后,建议取消git的口令,只允许公钥认证。


$sudo passwd git


管理员在客户端使用下面的命令,建立无口令登录:


$ssh-copy-id git@server


至此,已经完成了安装git服务的准备工作,可以开始安装Gitolite服务软件了。

[1]对Gitolite的各项改动采用了Topgit特性分支进行维护,以便与上游的最新代码同步更新。还要注意,如果使用Gitolite时发现问题,要区分是由上游软件引发的,还是因为我的改动引起的,不要把我的错误算在Sitaram头上。;-)

[2]本段内容为一整行,因排版需要做了换行处理。