Gitolite简介
先说几个重要的点
- Gitolite是对Git使用的一个封装
- Giolite服务器其实是使用perl脚本对通过Git命令进行权限检查
- Gitolite服务器的管理是通过一个名字叫做gitolite-admin的Git仓库进行管理的
gitolite 的原理很简单。首先,它提供了一个 gitolite-shell。当你使用 ssh 访问 gitolite 时 ssh 服务会启动 gitolite-shell。这个脚本会检查当前用户是否有权限访问对应的仓库。如果用户通过 git push 修改了仓库内容,则会触发 gitolite 预先配置 git hook,这些 hook 会执行创建仓库、添加用户之类的操作。
gitolite的本质是几个 prel 脚本加一些纯文本配置文件。
Gitolite的安装
先讲明Gitolite服务器管理的逻辑流程,这样在安装的时候更容易理解。
- 首先Gitolite安装时,最好指定一个特定用户,由该用户安装Gitolite,这样易于管理。我们指定的用户为
git
- 安装完成后,还需要指定一个用户作为gitolite服务器管理员,一般这个管理员不是上面说的
git
用户,而是日常工作中有权限管理项目代码权限的那个人,我们下面指定的管理员为bianjb
。需要说明,虽然用户不同,但是并不要求git用户和bianjb用户是否在同一台物理机器上,视自己情况而定即可 - 在安装gitolite时我们要指定
bianjb
为管理员,是依据bianjb用户的ssh-key来指定的。
讲明了上面三点,下面开始安装Gitolite。
这里使用的是ubuntu14.04平台,其它ubuntu版本也是类似的。
前面说了,我们需要使用ssh协议访问gitolite服务器,gitolite服务器是本质上是一个git仓库,所以首先需要安装基本包git
和ssh-server
,再安装gitolite
。
下面的所有操作都在用户主目录下进行。
1.安装git和ssh-server
在要安装gitolite的机器上安装
sudo apt-get install git openssh-server openssh-client
2.生成管理员公钥
注意:使用将要设置为管理员的用户登录
首先将gitolite管理用户的ssh-key准备好,在bianjb用户下执行如下命令:ssh-keygen -t rsa
,之后连续按三次回车键,如下:
bianjb@ubuntu:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/bianjb/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/bianjb/.ssh/id_rsa.
Your public key has been saved in /home/bianjb/.ssh/id_rsa.pub.
The key fingerprint is:
fc:b4:c8:d8:68:f5:38:e4:08:50:cb:9b:36:2a:51:6f bianjb@ubuntu
The key's randomart image is:
+--[ RSA 2048]----+
| . |
| o . |
| o o |
| . o o . |
|. E S . |
| . + o X * . |
|. . = B + |
| . . . |
| |
+-----------------+
这时就在/home/bianjb/.ssh/目录下生成的公钥和私钥,下面的安装需要用到公钥id_rsa.pub,先把它准备好。
3.创建用户git
同样在将要安装gitolite服务器的机器上添加用户git,并设置密码
$ adduser git
$ passwd git
3. 接下来下载gitolite源码
切换到git用户,并下载源码
$su git
$git clone https://github.com/sitaramc/gitolite
如下载成功,这时在git主目录下多一个gitolite文件夹。
4.安装gitolite
在git用户上进行安装,安装目录为$HOME/bin,所以先创建安装目录再安装。
$mkdir -p $HOME/bin
$ gitolite/install -to ${HOME}/bin
注意:安装路径要求为绝对路径,而不是相对路径
这时在$HOME/bin目录下就会多了一引起脚本文件和配置文件,这些就是gitlote服务器的程序。
5.设置gitolite管理员
在git用户下进行
将第一步中生成的管理员的id_rsa.pub拿过来,放在git主目录下,执行如下命令:
$bin/gitolite setup -pk id_rsa.pub
Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/
Initialized empty Git repository in /home/git/repositories/testing.git/
WARNING: /home/git/.ssh/authorized_keys missing; creating a new one
(this is normal on a brand new install)
如果输出相同的信息,那么说明设置成功了。从打印信息中可以看到,此时已经生成了服务器管理仓库gitolite-admin.git,这时你在git主目录下也可以看到一个repositories文件夹,里面有gitolite-admin.git文件夹,就是这个仓库。
6.gitolite管理员下载管理仓库
在gitolite管理员用户下执行git clone,也只有在管理员用户下可以clone,其它用户是没有权限的。
$git clone [email protected]:gitolite-admin.git
下载成功后,就可以看见gitolite-admin文件夹了,里面有conf和keydir两个目录,其中conf是配置仓库及其权限的,keydir是用来存放各个用户的ssh-key。
Gitolite服务器管理
服务器管理员如何进行代码的配置和权限管理呢?通过配置两个文件夹conf和keydir。
添加,删除,重命名一个仓库示例
编辑gitolite-admin/conf目录下gitolite.conf 文件
- 比如添加一个bar仓库(conf语法可以参考上一节的介绍)
repo bar
RW+= alice
git add .
git commit -m “add user zgkxp”
git push
添加完毕
要移除一个代码仓库,类似要编辑gitolite.conf 文件,删除对应的行并提交。但服务器的代码仓库并不会自动移除需要自己手动去移除。
重命名一个仓库按下面顺序(注意顺序)
(1)到服务器上把对应的仓库名字改掉,注意要保留“.git”后缀
(2)改变gitolite.conf中仓库的名字,并提交到服务器
keydir文件夹
其中keydir文件夹比较简,就是存放所有的用户公钥,不在该文件夹下面的公钥,其用户一律没有任何访问权限。
放在该文件夹下面的公钥应该以用户名区分,不可重复,后缀名为.pub。
看一下默认的内容:
bianjb@ubuntu:~/gitolite-admin/conf$ ls ../keydir/
bianjb.pub
只有一个管理员的公钥文件。
conf文件夹
下面详细说一下conf文件夹下面的gitolite.conf文件的使用,该文件控制了新建git仓库及其访问权限。
先看一下,默认的gitolite.conf文件内容:
repo gitolite-admin #管理员仓库
RW+ = bianjb #只有我设置的bianjb仓库有读写权限
repo testing #这是默认的测试用仓库,名字叫testing
RW+ = @all #keydir下任何人都有读写权限
详细的语法规则
1 基本语法
(1)注释,以“#”作为注释的开发
(2)没有续行符“\”
(3)所有的东西都是用空格作为分隔符(不用逗号,分号等)
(4)用户名和代码库名可以包含'.' '_' '-'等,代码库可以包含"/",用户名可以有“@”
(5)组名必须以@开始
2 组的定义
用户组和代码库组定义是一样的两者没差别。
- 简单定义了一个组
@developers = dilbert alice wally
- 组的值是累积的所以也可以按下面这么定义,和上面的一样
@developers = dilbert
@developers = alice
@developers = wally
- 组的定义可以嵌套,但值是立即展开的,也就是说后面定义的值,不会在加的嵌套的组里面
@developers = dilbert alice
@interns = ashok
@staff = @interns @developers
@developers = wally# wally 用户并不属于 @staff 组
- 正常使用的一个例子
@developers = dilbert alice wally
@foss-repos = git gitoliterepo @foss-repos
RW+= @developers
- @all是一个特殊组,它可以包括所有的用户或者所有的代码库
3. 访问规则
访问规则一般由四部分组成:[代码仓库名] [用户名] [操作] [ref]
(1)"repo"行
可以跟一个或者多个代码仓库,也可以跟组名,或者用正则表达式也可以。
(2)规则行
从"repo"开始到下一个"repo"出现之前的行都属于规则行,一般是权限域 refex = 用户名或者组名等
repo foo bar #两个仓库foo和bar配置相同的规则行
RW+= alice @teamleads
- master = dilbert @devteam
- refs/tags/v[0-9] = dilbert @devteam
RW+ dev/ = dilbert @devteam
RW= dilbert @devteam
R= @managers
- 权限域里常用的权限
- R, 只读
- RW, 允许 push 一个分支 branch, 或者创建一个 branch/tag
- RW+, 可以快速推送, 倒回或者删除 branches or tags
-
- 拒绝访问
(3)refex
用来匹配代码仓库的引用(ref),一般使用正则表达式来表示
如果没有指定refex,则是以refs/.*作为默认值,比如
- 拒绝访问
RW = alice
如果指定了refex,但不是以refs/作为开始,则认为以refs/heads/开始,比如
RW master = alice# becomes 'refs/heads/master' internally
如果是对tag进行限制,则必须写全
RW refs/tags/v[0-9] = bob
refex默认开头是固定的,但是结尾可以随意匹配,换句话说就是有正则表达式的“^”在开头但是没有“$”在结尾,比如只指定master的话,下面这些对它都匹配
refs/heads/master
refs/heads/master1
refs/heads/master2
refs/heads/master/full
而对refs/tags/v[0-9], v1 , v12, v1.2,v12345这些都是对的。
如果你不想随意匹配的话,那在表达式后面加个$就行了,比如
RW master$ = alice
(4)需要注意的是=后面的用户名或者组名不能使用正则表达式来表示
# managers should be able to read any repo
repo @all
R= @managers# ...other rules for other repos...
repo foo bar
RW+ = alice @teamleads
- master = dilbert @devteam
- refs/tags/v[0-9] = dilbert @devteam
RW+ dev/ = dilbert @devteam
RW = dilbert @devteam
R = @managers
补上默认值,等效于下面
1 # managers should be able to read any repo
2 repo @all
3 R refs/.* = @managers
4
5 # ...other rules for other repos...
6
7 repo foo bar
8
9 RW+ refs/.* = alice @teamleads
10 - refs/heads/master = dilbert @devteam
11 - refs/tags/v[0-9] = dilbert @devteam
12 RW+ refs/heads/dev/ = dilbert @devteam
13 RW refs/.* = dilbert @devteam
14 R refs/.* = @managers
(5)规则累积
repo 不一定是在一处要全部指定完,可以在别处补充,也可以被其它repo间接补充
比如
repo foo # ...some rules...# ...other repos and rules...
repo foo # ...more rules for foo...
# managers should be able to read any repo
repo @all
R= @managers
# anyone can clone open source repos
repo @FOSS
R= @all
4.规则检查
用户dilbert 对foo代码仓库的任何ref(any)的W权限检查
gitolite access -s foo dilbert W any
类似的其他检查
gitolite access -s foo dilbert W xyz
gitolite access -s foo dilbert + refs/heads/xyz