王志明

gitolite 管理代码库

Git - Gitolite

Gitolite 是在 Git 的一个授权层,依托 ssh 和 https 来进行认证。

认证:认证是确定用户是谁。 授权:授权是决定用户是否可以进行某些操作。

Gittolite 可以给用户定义仓库的访问权限,还可以定义用户在仓库中 branch 和 tag name 的访问权限。

安装

首先我们要准备一台服务器 gitserver ,并在 gitserver 中创建一个用户:git。

把自己工作机的公钥上传到 gitserver ,用于认证。

上传工作机公钥:

$ scp -r YourName.pub git@gitserver:~/YourName.pub

安装 gitolite :

ssh git@gitserver // 登录 gitserver

$ git clone git://github.com/sitaramc/gitolite
$ mkdir -p $HOME/bin
$ gitolite/install -to $HOME/bin 
$ gitolite setup -pk YourName.pub

到这安装就完毕了。

管理

安装完毕后在 $HOME 目录会有一个 repositories 目录,repositories 就是默认的 git 仓库目录。

git@gitserver:~$ ls repositories
gitolite-admin.git  testing.git

仓库目录中 gitolite-admin.git 是 gitolite 提供的权限配置管理库,testing.git 是一个测试库。

我们回到工作机,把 gitolite-admin.git clone 下来。

$ git clone git@gitserver:gitolite-admin.git
$ cd gitolite-admin
$ tree
.
├── conf
│   └── gitolite.conf
└── keydir
    └── mars.pub

2 directories, 2 files

conf 目录是 gitolite 的配置文件目录。 keydir 是存放用户公钥的目录。

配置

配置文件 conf/gitolite.conf

$ cat conf/gitolite.conf
repo gitolite-admin
    RW+     =   mars

repo testing
    RW+     =   @all

以上是安装后默认的配置内容。

配置文件基本语法

对于 gitolite.conf 配置文件来讲,它的配置语法格式非常简单,基本可以概括为如下几条:

  1. 任何需要间隔的地方均可以使用空格符,在任何地方都不允许使用逗号或分号。

  2. 注释符号使用方法和 perl/shell 一致

  3. 用户名或代码仓库名称应尽量的简单,可以以字母或数字开头,后面还可以接“.”、“-”、“_”等。

  4. 用户名中也可以使用@符号,这是为了便于我们使用邮箱地址来作为用户名。

  5. 代码仓库名称中可以使用/符号,这是为了多层结构的代码仓库。

访问规则

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。

组概念

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是一个特殊的组,当你需要指定所有的用户、所有的代码仓库时可以使用此组。

rc文件介绍

我们所说的rc文件是指~/.gitolite.rc。这个文件是一个perl语法的文件,但是你无需学习perl也可以配置它。这个文件是在安装gitolite时产生的。

GIT-CONFIG

gitolite允许用户们在不必登陆服务器的情况下就可以设置git config的相应配置,而且是对不同的代码仓库可以设置不同的配置项。(这需要在.gitolite.rc中开启此功能,否则默认是禁止的)

repo foo
    config hooks.mailinglist = foo-comits@example.tld
    config hooks.emailprefix = '[foo] '

GIT-DAEMON

如果希望gitolite为某个代码仓库创建git-daemon-export-ok标记文件,以便让git-daemon读取,则方法如下(如果用户被设置为@all,则默认便会有git-daemon-export-ok标记文件的):

repo foo
    R = daemon

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

命令介绍

用户可以在自己的客户端机器上执行如下命令,获得可用命令列表:

$ ssh git@192.168.56.130 help
hello mars, this is git@gitserver running gitolite3 v3.6.6-3-g72c0238 on git 1.9.1

list of remote commands available:

	desc
	help
	info
	perms
	writable

其中最常用的便于info命令。

如果你有在服务器端执行shell命令的权限那么你可以执行更多的gitolite命令:

$ gitolite help
hello, this is git@gitserver running gitolite3 v3.6.6-3-g72c0238 on git 1.9.1

list of gitolite commands available:

	1plus1
	D
	access
	config
	create
	creator
	desc
	fork
	git-annex-shell
	git-config
	help
	htpasswd
	info
	list-dangling-repos
	lock
	mirror
	motd
	owns
	perms
	print-default-rc
	push
	readme
	rsync
	sshkeys-lint
	sskm
	sudo
	svnserve
	symbolic-ref
	who-pushed
	writable
Newer >>