Gitolite服务器搭建及使用教程

Gitolite简介

先说几个重要的点

  1. Gitolite是对Git使用的一个封装
  2. Giolite服务器其实是使用perl脚本对通过Git命令进行权限检查
  3. Gitolite服务器的管理是通过一个名字叫做gitolite-admin的Git仓库进行管理的

gitolite 的原理很简单。首先,它提供了一个 gitolite-shell。当你使用 ssh 访问 gitolite 时 ssh 服务会启动 gitolite-shell。这个脚本会检查当前用户是否有权限访问对应的仓库。如果用户通过 git push 修改了仓库内容,则会触发 gitolite 预先配置 git hook,这些 hook 会执行创建仓库、添加用户之类的操作。

gitolite的本质是几个 prel 脚本加一些纯文本配置文件

Gitolite的安装

先讲明Gitolite服务器管理的逻辑流程,这样在安装的时候更容易理解。

  1. 首先Gitolite安装时,最好指定一个特定用户,由该用户安装Gitolite,这样易于管理。我们指定的用户为git
  2. 安装完成后,还需要指定一个用户作为gitolite服务器管理员,一般这个管理员不是上面说的git用户,而是日常工作中有权限管理项目代码权限的那个人,我们下面指定的管理员为bianjb需要说明,虽然用户不同,但是并不要求git用户和bianjb用户是否在同一台物理机器上,视自己情况而定即可
  3. 在安装gitolite时我们要指定bianjb为管理员,是依据bianjb用户的ssh-key来指定的。

讲明了上面三点,下面开始安装Gitolite。
这里使用的是ubuntu14.04平台,其它ubuntu版本也是类似的。
前面说了,我们需要使用ssh协议访问gitolite服务器,gitolite服务器是本质上是一个git仓库,所以首先需要安装基本包gitssh-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

你可能感兴趣的:(Gitolite服务器搭建及使用教程)