本篇博文只会讲解gitolite的基础内容,主要包括了gitolite的安装方法、权限设置方法和基本的使用方法。
如果你希望学习到完整的教程,可以移步这里。
先说说我们大概会讲到哪些内容,以及讲解顺序:
01 - 安装和设置
02 - 增加用户和代码仓库
03 - 为你的用户提供支持
04 - 配置文件基本语法
05 - 访问规则
06 - 组概念
07 - 命令介绍
08 - rc文件介绍
09 - GIT-CONFIG
10 - GIT-DAEMON
11 - GITWEB=================
[01] - 安装和设置
想安装gitolite,在软件方面有一些小小的前提条件:
1 UNIX/LINUX操作系统
2 shell环境
3 git 1.6.6+
4 perl 5.8.8+
5 openssh 5.0+
6 专为gitolite使用的账号(本文会设置为git)在正是开始安装gitolite之前,我们先做一些交代:
1 gitolite可以分为server/client,server是搭建在服务器上,存储着代码库和所有用户的各类管理信息。client则是指所有使用gitolite服务的用户们,用户们会在自己的电脑(windows/linux/mac/android/ios等等)上通过git/ssh等命令与gitolite服务进行交互,包括下载代码、上传代码、管理用户等等。
2 我们将server所在机器成为服务器端机器(域名设定为server-host),将client所在机器成为客户端机器(域名设定为client-host)
3 gitolite的用户中,有一部分(极少数的几位)扮演着gitolite管理者的角色,他们具有管理用户授权的权利。
4 gitolite可以并行管理非常多的开发项目,每一个项目会对应一个独立的git repository,我们把之为代码仓库,即每一个项目会对应一个代码仓库。
好了,闲言少叙,我们现在就开始gitolite的安装咯,其实步骤非常简答,甚至比经典的“5分钟搭建wordpress”还要简单:
1 以git账号登入server所在服务器(服务器端机器)
2 确保~/.ssh/authorized_keys为空或不存在
3 选择你自己的一台机器作为client机器(客户端机器,建议区别于服务器端机器),并将这台客户端机器的公钥上传并保存在服务器端机器的/home/git/YourName.pub位置(本博文中使用rocmac.pub。如果是在windows平台,可以安装puttygen工具来生成公钥)。
4 在服务器端执行如下命令,下载gitolite主程序:
cd /home/git
git clone git://github.com/sitaramc/gitolite
mkdir -p /home/git/bin
gitolite/install -to /home/git/bin(在bin文件夹中会多出不少文件)
gitolite setup -pk rocmac.pub在安装过程中,如果遇到如下提示:
$ ./gitolite/install -to /home/git/bin
Can't locate Time/HiRes.pm in @INC (@INC contains: /home/git/gitolite/src/lib /usr/local/lib/perl5 /usr/local/share/perl5 /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5 /usr/share/perl5 .) at /home/git/gitolite/src/lib/Gitolite/Common.pm line 76.
BEGIN failed--compilation aborted at /home/git/gitolite/src/lib/Gitolite/Common.pm line 76.
Compilation failed in require at ./gitolite/install line 15.
BEGIN failed--compilation aborted at ./gitolite/install line 15.那么解决方法也很简单(以fedora 15举例):
yum install perl-Time-HiRes.i686[02] - 增加用户和代码仓库
不建议直接在服务器端机器上手动添加新的代码仓库和新用户,因为这些操作完全可以由管理员在客户端机器上远程操控完成。
为此,Gitolite提供了一个特殊的代码仓库,名叫gitolite-admin(你可以在服务器端机器的/home/git/repositories/中找到)。
用户元信息、代码仓库元信息以及授权元信息,都是存储在gitolite-admin代码仓库中的,管理员在客户端机器修改后通过push命令更新到server上来,以达到用户管理和代码仓库管理的目的。
所以,我们现在要到自己的客户端机器(client-host)上,执行如下命令,以获取到服务器端的gitolite-admin这一特殊的代码仓库(我们称之为管理仓库):
git clone git@server-host:gitolite-admin
#如果你的服务器端sshd的服务端口是12345,那么就是用如下命令:
git clone ssh://git@server-host:12345/gitolite-admin这样的话,你就已经把服务器端的gitolite-admin管理仓库克隆到客户端机器本地了,你可以直接cd到gitolite-admin文件夹,映入眼帘的应该是conf和keydir两个子文件夹。
keydir文件夹就是管理用户公钥的地方,如果有一位新用户(tom)希望申请账户并申请一个新的代码仓库(代码仓库叫做tomtest),那么让他提供他的账号、他用的电脑的公钥给你(可以通过email/IM等各种途径都无所谓),然后由你(你具有管理权限)在keydir下创建tom.pub问价并将tom的公钥复制其中。
现在要为tom设置新的代码仓库了,做法是打开conf/gitolite.conf文件,加入如下的内容:
repo tomtest
RW+ = tom然后保存退出。
最后,就是将刚才在客户端更改的内容上传到服务器端了:
git add conf
git add keydir
git commit -m "add tom user. add tomtest repo, and set access rules."
git pushpush生效后,gitolite就会在服务器端的/home/git/.ssh/authorized_key下创建新用户tom相应的内容,并且还会创建一个全新的空的代码仓库tomtest。
[03] - 为你的用户提供支持
当用户申请账号和权限的流程完成后,你需要把用户访问代码仓库的URL链接发给他,一般URL为git clone git@host:reponame形式。
继续拿tom举例,如果tom想查询他到底可以访问哪些代码仓库,可以让tom在自己的客户端机器上执行如下命令:
ssh git@server-host info
#如果server-host的sshd服务端口是12345的话
ssh git@server-host -p 12345 info[04] - 配置文件基本语法
对于gitolite.conf配置文件来讲,它的配置语法格式非常简单,基本可以概括为如下几条:
1 任何需要间隔的地方均可以使用空格符,在任何地方都不允许使用逗号或分号。
2 注释符号使用方法和perl/shell一致
3 用户名或代码仓库名称应尽量的简单,可以以字母或数字开头,后面还可以接“.”、“-”、“_”等。
4 用户名中也可以使用@符号,这是为了便于我们使用邮箱地址来作为用户名。
5 代码仓库名称中可以使用/符号,这是为了多层结构的代码仓库。[05] - 访问规则
gitolite对于代码仓库和用户的权限控制功能很灵活,大家要仔细阅读下面的内容。
访问规则的最简单的语法是这样的:
repo 仓库名称位
权限位 匹配规则位 = 用户(组)位如果权限位设置了R权限,则相应的用户对所设置的代码仓库具有读权限,例如fetch和clone动作都是需要读权限的。
而对于push动作,代表了写权限,而写权限的设置会稍显复杂些,大致可分两大类来讲解:
第一类为权限相关:
1 如果权限位设置为RW,那么所设置的用户在代码库fast-forward情况下允许进行push操作,否则禁止push;(如果你不了解fast-forward,则需要先了解下git相关知识)
2 如果权限设置为RW+,那么允许任何形式的push,包括在非fast-forward状态下的强制更新。
3 如果权限设置为-,则会禁止相应的push。但是-并不会影响用户的读权限。
4 如果未设置有关push的规则,则默认禁止push
第二类为正则匹配:
1 如果未设置正则匹配,则默认为refs/.*
2 如果设置的正则匹配没有以refs/开头,则默认会自动加上refs/head/
3 默认情况下,会在正则匹配前面自动加上^
如下是一个稍显复杂的规则设置:
repo roctest
RW+ = alice
- master = bob
- refs/tags/v[0-9] = bob
RW = bob
RW refs/tags/v[0-9] = carol
R = dave我们来具体解读这个例子:
1 alice可以对任何分支、任何tag做任何事情,包括create/delete/push/overwrite等
2 bob可以进行fast-forward-push,但是却不能对以master开头的分支进行push
3 bob可以创建tag,但是却不能创建以v+数字命名的tag
4 carol则只可以创建以v+数字命名的tag
5 dave则只允许clone和fetch。[06] - 组概念
gitolite允许我们对用户或代码仓库进行分组,以便于管理。
对于用户组,我们可以把组认为是角色的概念。
如下是一些例子:(代码仓库组与用户组的设置方法完全相同)
@staff = alice bob carol
@interns = ashok
repo secret
RW = @staff
repo foss
RW+ = @staff
RW = @interns对于组的定义采用追加规则,即如下两行的效果和上例中对@staff的定义效果完全相同(但对于权限相斥的情况,一般会以禁止为先):
@staff = alice bob
@staff = carol另外,组也可以嵌套定义:
@all-devs = @staff @interns最后再补充一点:
@all是一个特殊的组,当你需要指定所有的用户、所有的代码仓库时可以使用此组。[07] - 命令介绍
用户可以在自己的客户端机器上执行如下命令,获得可用命令列表:
$ ssh git@server-host help
hello rocmac, this is gitolite3 v3.2-13-gf89408a on git 1.7.1
list of remote commands available:
desc
help
info
perms
writable其中最常用的便于info命令。
如果你有在服务器端执行shell命令的权限那么你可以执行更多的gitolite命令:
$ gitolite help
hello, this is gitolite3 v3.2-13-gf89408a on git 1.7.1
list of gitolite commands available:
D
access
create
creator
desc
fork
git-config
help
htpasswd
info
list-dangling-repos
lock
mirror
perms
print-default-rc
push
rsync
sshkeys-lint
sskm
sudo
svnserve
symbolic-ref
who-pushed
writable[08] - rc文件介绍
我们所说的rc文件是指~/.gitolite.rc。这个文件是一个perl语法的文件,但是你无需学习perl也可以配置它。这个文件是在安装gitolite时产生的。
[09] - GIT-CONFIG
gitolite允许用户们在不必登陆服务器的情况下就可以设置git config的相应配置,而且是对不同的代码仓库可以设置不同的配置项。(这需要在.gitolite.rc中开启此功能,否则默认是禁止的)
repo foo
config hooks.mailinglist = foo-comits@example.tld
config hooks.emailprefix = '[foo] '[10] - GIT-DAEMON
如果希望gitolite为某个代码仓库创建git-daemon-export-ok标记文件,以便让git-daemon读取,则方法如下(如果用户被设置为@all,则默认便会有git-daemon-export-ok标记文件的):
repo foo
R = daemon[11] - GITWEB
如果需要通过web来浏览代码仓库信息,请将代码仓库名称加入到服务器端的projects.list文件中。同时,设置:
repo foo
R = gitweb另外,如果你希望gitweb能从gitoloite中获取更详细的代码仓库信息,则你还可以专门设置一些信息,以便gitweb自动读取:
repo foo
config gitweb.owner = some person's name
config gitweb.description = some description
config gitweb.category = some category谢谢!