参考资料:
http://www.ossxp.com/doc/git/gitolite.html
架设环境debian squeeze,所有安装软件均为debian源上自带。
主要参考文献:
1、蒋鑫作品http://www.ossxp.com/doc/git/gitolite.html (堪称中文入门手册)
2、Gitolite自带文档https://github.com/sitaramc/gitolite/tree/master/doc (仔细阅读自带文档,会帮助解决细节问题)
3、Gitolite WIKI http://sitaramc.github.com/gitolite/
Gitolite安装:
1、安装软件
sudo apt-get install gitolite git-core
2、产生G管理员的ssh key
确定某个账号,可以是server上的账号,也可以是某个客户端的账号,但是只能是唯一的。
在该账号下,用ssh-keygen产生ssh key。
在终端下运行ssh-keygen,默认在~/.ssh下产生文件 id_rsa.pub。
将这个文件放到服务器/tmp/下,命名为admin.pub。
2、建立git专用账号
sudo adduser --system --shell /bin/bash --group git
sudo adduser git ssh
sudo passwd git
以后上传下载工作都通过该账号进行,但是不直接使用该账号登陆,而是通过ssh key的认证。原理见文献1。
3、建立Gitolite仓库
su git进入git账号
gl-setup /tmp/admin.pub以admin.pub的账号为管理员,建立Gitolite仓库。
这时会在git账号下产生repositories目录,下面有两个子目录gitolite-admin.git和testing.git
4、初涉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。由于个别地方已不适用,所以稍作修改。
下面我们看一个简单的授权文件:
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
在上面的示例中,我们演示了很多授权指令。
第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 分支。 (仅此分支,精确匹配)。
5、添加版本库
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
即推送完成。
6、高级管理
在4里,提到了大部分权限管理的情况。如果还不够用,就要进入通配符授权:
a、用户私有版本库
授权文件如下:
1 @administrators = jiangxin admin
2
3 repo users/CREATOR/.+$
4 C = @all
5 R = @administrators
说明:用户可以在自己的名字空间( /users/<userid>/ )下,自己创建版本库。
CREATOR是所有用户的通配符。创建者对版本库有最高权限,其他人只有读权限(当然可以另外设置)。
b、用户私有分支
授权文件:
repo test/repo4
RW+ dev/USER/ = @all
RW+ master = @dev
说明:
7、Gitweb
上述操作的结果都没有直观的显示,这对将来的用户会造成一定的了解障碍。
这个障碍可以通过Gitweb来克服。Gitweb是一个网页前端,它的工作就是将git仓库的内容用网页形式展现出来。(如git.kernel.org上密密麻麻的仓库与分支)
这样开发者会更清楚地知道,去找自己需要的东西。
1、安装软件
sudo apt-get install gitweb
2、修改/etc/gitweb.conf
$projectroot = "/data/git-repo" <-- 此处应该是gitolite仓库的位置。我将之前git账号下的repositories移出来了,然后做了个链接回去(ln -s /data/git-repo /home/git/repositories)。
3、配置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)
4、将www-data加入git组