看日记学git

gitolite的README译文

本原创文章属于《Linux大棚》博客。

博客地址为http://roclinux.cn

文章作者为roc

==

本篇博文只会讲解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 push /* 如果是第一次push,请使用:git push origin master */

push生效后,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

如果你的用户想从仓库中获取他的项目源码,则用如下命令:

$ git clone ssh://git@your.domain.name:sshd_port/your_repo_name

[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

谢谢!

1条评论

  1. 您好 问下,
    R zjex& = xxxx
    这样写是不是 xxxx只能访问zjex分支,但是我在gitolite里面根本不行!

发表您的评论

请您放心,您的信息会被严格保密。必填项已标识 *