Gitolite 构建 Git 服务器的权限管理

参考资料:html

    http://www.ossxp.com/doc/Git/gitolite.html前端

架设环境debian squeeze,全部安装软件均为debian源上自带。git

主要参考文献:github

一、蒋鑫做品http://www.ossxp.com/doc/git/gitolite.html (堪称中文入门手册)web

二、Gitolite自带文档https://github.com/sitaramc/gitolite/tree/master/doc 仔细阅读自带文档,会帮助解决细节问题正则表达式

三、Gitolite WIKI http://sitaramc.github.com/gitolite/   shell


Gitolite安装:apache

一、安装软件bash

sudo apt-get install gitolite git-core服务器


二、产生G管理员的ssh key

肯定某个帐号,能够是server上的帐号,也能够是某个客户端的帐号,可是只能是惟一的。

在该帐号下,用ssh-keygen产生ssh key。

在终端下运行ssh-keygen,默认在~/.ssh下产生文件 id_rsa.pub。

将这个文件放到服务器/tmp/下,命名为admin.pub。


二、创建git专用帐号

sudo adduser --system --shell /bin/bash --group git

sudo adduser git ssh 

sudo passwd git

之后上传下载工做都经过该帐号进行,可是不直接使用该帐号登录,而是经过ssh key的认证。原理见文献1。


三、创建Gitolite仓库

su git进入git帐号

gl-setup /tmp/admin.pub以admin.pub的帐号为管理员,创建Gitolite仓库。

这时会在git帐号下产生repositories目录,下面有两个子目录gitolite-admin.git和testing.git


四、初涉Gitolite管理

在G管理员帐号下,运行 git clone git@server_ip:gitolite_admin.git

这样在G管理员账号下,就有一个gitolite_admin的文件夹,里面是管理gitolite仓库的配置文件和Key文件。

增长用户:

将某人的ssh key文件abc.pub,复制到gitolite_admin/Keydir下;

而后 git add Keydir/abc.pub

git commit -m 'add abc'

git push origin master

这样就添加好了abc用户。

Gitolite是管理git用户的,但Gitolite自己又是经过git来操做的。颇有意思吧!

相信删除的方法不用我讲了吧!


配置用户权限:

Gitolite是用来管理用户行为的,这个有conf/gitolite.conf完成。

下面全部例子来自参考文献1。因为个别地方已不适用,因此稍做修改。

下面咱们看一个简单的受权文件:

<span style="color: rgb(153, 153, 153);">1   @admin = jiangxin wangsheng 

2

3   repo gitolite-admin

4       RW+                 = jiangxin

5

6   repo ossxp/..*

7       C                   = @admin

8       RW                  = @all

9

10  repo testing

11      RW+                         =   @admin

12      RW      master              =   junio

13      RW+     pu                  =   junio

14      RW      cogito$             =   pasky

15      RW      bw/                 =   linus

16      -                           =   somebody

17      RW      tmp/                =   @all

18      RW      refs/tags/v[0-9]    =   junio</span>

在上面的示例中,咱们演示了不少受权指令。

  • 第1行,定义了用户组 @admin,包含两个用户 jiangxin 和 wangsheng。

  • 第3-4行,定义了版本库 gitolite-admin。并指定只有用户 jiangxin 才可以访问,并拥有读(R)写(W)和强制更新(+)的权限。

  • 第6行,经过正则表达式定义了一组版本库,即在 ossxp/ 目录下的全部版本库。

  • 第7行,用户组 @admin 中的用户,能够在 ossxp/ 目录下建立版本库。

    建立版本库的用户,具备对版本库操做的全部权限。

  • 第8行,全部用户均可以读写 ossxp 目录下的版本库,但不能强制更新。

    (注意:RW和C分开两行是指软件仓库的权限,RWC在一行是分支的权限。见gitolite文档wildcard-repositories.mkd)

  • 第9行开始,定义的 testing 版本库受权使用了引用受权语法。

  • 第11行,用户组 @admin 对全部的分支和里程碑拥有读写、重置、添加和删除的受权。

  • 第12行,用户 junio 能够读写 master 分支。(还包括名字以 master 开头的其余分支,若是有的话)。

  • 第13行,用户 junio 能够读写、强制更新、建立以及删除 pu 开头的分支。

  • 第14行,用户 pasky 能够读写 cogito 分支。 (仅此分支,精确匹配)。


五、添加版本库

a、建一个空版本库

只须要在conf/gitolite.conf中添加一个规则,好比

repo work1

RW+=@all

这样gitolite就会自动建立一个空的版本库。

b、上传已有版本库

如上面的例子第6~8行中设定的规则,能够由admin(或指定其余帐号),在指定目录下上传版本库。

在本机的版本库下执行:

git remote add r-server git@server_ip:ossxp/repo.git

git push r-server master

即推送完成。


六、高级管理

在4里,提到了大部分权限管理的状况。若是还不够用,就要进入通配符受权:

a、用户私有版本库

受权文件以下:

<span style="color: rgb(153, 153, 153);">1  @administrators = jiangxin admin

2

3  repo users/CREATOR/.+$

4      C = @all

5      R = @administrators

</span>

说明:用户能够在本身的名字空间( /users/<userid>/ )下,本身建立版本库。

CREATOR是全部用户的通配符。建立者对版本库有最高权限,其余人只有读权限(固然能够另外设置)。

b、用户私有分支

受权文件:

<span style="color: rgb(153, 153, 153);">repo test/repo4
    RW+   dev/USER/  <span style="white-space: pre;">	</span>= @all
    RW+   master <span style="white-space: pre;">	</span>= @dev
</span>

说明:

    • 全部用户均可以在 refs/heads/dev/<userid>/ (本身的名字空间)下建立、删除分支。可是不能修改其余人的分支
    • 用户组 @dev 中的用户,对 master 分支具备读写和强制更新的权限,可是不能删除。
更改好配置文件后,一样适用git的方法,push到server上去。


七、Gitweb

上述操做的结果都没有直观的显示,这对未来的用户会形成必定的了解障碍。

这个障碍能够经过Gitweb来克服。Gitweb是一个网页前端,它的工做就是将git仓库的内容用网页形式展示出来。(如git.kernel.org上密密麻麻的仓库与分支)

这样开发者会更清楚地知道,去找本身须要的东西。

一、安装软件

sudo apt-get install gitweb

二、修改/etc/gitweb.conf

$projectroot = "/data/git-repo" <-- 此处应该是gitolite仓库的位置。我将以前git帐号下的repositories移出来了,而后作了个连接回去(ln -s /data/git-repo /home/git/repositories)。

三、配置web

修改/etc/apache2/sites-available/default

我将原来的/var/www的内容换成了:

DocumentRoot /var/www                                                          
    <Directory /var/www>                                                           
        Options ExecCGI Indexes +FollowSymLinks MultiViews                         
        Order allow,deny                                                           
        Allow from all                                                             
        AllowOverride all                                                          
        AddHandler cgi-script cgi                                                  
        DirectoryIndex gitweb.cgi                                                  
        SetEnv  GITWEB_CONFIG  /etc/gitweb.conf                                    
    </Directory>     

而后,在/var/www下执行

sudo ln -s /usr/share/gitweb/* .

sudo ln -s gitweb.cgi index.html

这样进入http://server-ip就能够看到相似git.kernel.org的东东了。

对了,别忘了修改仓库的权限(chmod a+x /data/git-repo -R)

四、将www-data加入git组