IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

gitolite的README译文

linux大棚-roclinux.cn 2012-12-17 13:32:00 累计浏览 1,973 次
本机暂存

本篇博文只会讲解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生效后,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

谢谢!

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. Git常用命令备忘 (累计阅读 54,693)
  2. Git log diff config高级进阶 (累计阅读 24,842)
  3. Git subtree 要不要使用 –squash 参数 (累计阅读 23,396)
  4. 我的git笔记 (累计阅读 20,259)
  5. 公司倒了,请让领导先走 (累计阅读 13,407)
  6. 别为大公司拼命(译文) (累计阅读 10,295)
  7. nginx的配置文件 (累计阅读 9,880)
  8. Zookeeper研究和应用 (累计阅读 9,481)
  9. Zend Studio集成Git使用 (累计阅读 8,978)
  10. 学你妹的计算机! (累计阅读 8,137)