gitolite v3安装配置

gitolite用于git版本库的权限控制。

gitolite发端自gitosis,功能早已超越后者,而且gitosis已停止更新好多年!

安装

使用单独的用户git来安装gitolite

创建用户

1
# adduser --shell=/bin/bash git

安装gitolite
先为自己生成一个密钥对

1
$ ssh-keygen -b 2048 -t rsa -f your_name

然后

1
2
3
4
$ git clone git://github.com/sitaramc/gitolite
$ mkdir -p $HOME/bin
$ $HOME/gitolite/install -to $HOME/bin
$ $HOME/bin/gitolite setup -pk your_name.pub

安装就算完成了。
安装之后gitolite会在$HOME/repositories目录下初始化两个git仓库,gitolite-admin.git和testing.git,前者用于管理gitolite,后者是个测试用的仓库。

配置
gitolite通过更新gitolite-admin.git仓库来实施管理。所以要先clone这个仓库:

1
$ git clone gitolite:gitolite-admin

这里gitolite是为ssh配置的主机别名。

用户管理

将git用户的公钥拷贝到进入管理仓库下的子目录keydir,然后提交推送即可。用户的公钥以username.pub的格式命名,username与权限管理时指定的用户名必须是一致的。

权限管理

权限管理就是配置管理仓库子目录conf下的gitolite.conf文件。配置完毕提交推送权限就会生效。

先列出一个简单的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@admin = openwares
@staff = minli.wang @admin

repo gitolite-admin
RW+ = @admin

repo testing
RW+ = @all

repo foobar
RW+ = @admin
- master = @staff
- refs/tags = @staff
RW devel = @staff
RW+ = @staff

gitolite支持按用户或组管理权限。组名以@开头,可以包含多个用户,名字以空格分隔。组还可以嵌套其他组。
权限规则行的格式为:

1
<permission> <zero or more refexes> = <one or more users/user groups>

refex的含义见下一节

权限分类和规则

  • C
    可以创建新仓库
  • R
    可以读取仓库
  • RW
    可以读取,fast-forward推送,创建分支和标签
  • RW+
    可以进行任何类型的push,包括delete,rewind,overwrite等
  • -
    拒绝任何类型的推送

对于clone和fetch操作,只要当前用户具有R,RW或RW+任何一种权限,都可以读取仓库,其实就是存在R权限。
对于push操作,gitolite顺序处理权限规则,直到找到一条用户,权限许可和分支模式完全匹配的规则为止,之后的规则不再处理,所以一定要注意权限规则的顺序问题。

refex
refex这玩意儿就类似于regex的叫法,是指ref的匹配模式。有以下匹配规则:

  • 空的refex处理为’refs/.*’,也就是匹配任何refs,因为ref默认都存在于refs/目录下

  • 如果指定的refex没有以refs/开头,则为其添加前缀refs/heads/

  • refex使用隐式的行首规则,^在规则表达式中为匹配行首,refex默认从行首匹配,但没有$行尾匹配。举个栗子,如果指定refex为master,则下面这几个ref都可以匹配:

    1
    2
    3
    refs/heads/master
    refs/heads/master1
    refs/heads/master/full
  • 最后实际被推送到的ref以经过规则匹配后的结果为准

个人分支
gitolite支持为用户设立个人分支空间,其规则如下:

1
RW+ personal/USER/ = alice

personal可以为任何字符,/USER/会被替换成实际的用户名,因此用户alice可以在personal/alice/目录推送任何分支,比如
personal/alice/foo和personal/alice/bar,但不能推送到personal/alice。

个人分支空间为每个用户设立一个私人空间,防止公共分支空间的名字污染。开发者可以随意使用自己的个人分支空间,无需关心其权限问题,也不用担心分支名字冲突。

gitolite shell

gitolite提供了一个简单的ssh shell,可以了解远程仓库的一些信息和进行一些管理操作,以下命令可以查看shell的帮助:

1
$ ssh gitolite help

gitolite是远程gitolite的ssh别名。可以在每个支持的命令后面添加-h参数来了解命令的详细用法。比如:

1
$ ssh gitolite help -h

新建gitolite远程仓库
有这么几种方法:

  • 服务器管理员远程登录服务器,直接在$HOME/repositories目录下初始化裸仓库,这和使用git没有任何差别
  • 修改gitolite-admin/conf/gitolite.conf文件,添加新仓库及其权限,提交推送时,gitolite会自动创建新仓库
  • 具有创建仓库权限的用户,可以本地创建空仓库,然后添加远程仓库引用,推送后gitolite会为用户创建新仓库。比如:
    1
    2
    3
    4
    5
    6
    mkdir somegit
    cd somegit
    git init
    git commit --allow-empty
    git remote add origin git@server:Projects/somegit.git
    git push origin master

删除gitolite仓库
先删除配置文件中仓库的相关配置,然后登录服务器删除仓库,gitolite不会自动删除仓库。

References:
[1]github:gitolite
[2]official:gitolite

===
[erq]