Linux搭建git服务器gitolite

动机

一直想有个Git代码服务器来同步代码。之前用的Github,但是只有付费账号才能创建私有仓库。开了2年的付费Micro账号,真心很贵,而且速度比较慢,又不稳定,之后就不再续费了。

然后又用国内的Git服务器什么GitCafe,后来这个挂了。还用过OSChina的Git,这个速度很快,目前还存活着。但是心里对国内的服务不太放心,会泄露我重要的代码,总觉得不靠谱,所以在国内的Git服务只是存放一些不重要的代码仓库。

最后一条路是自己买个VPS搭建一个Git代码服务器。最先想到的是Gitlab,它跟Github很类似。但是它使用Ruby语言写的,又慢又占用资源,最低的硬件要求居然是2GB内存。用过一段时间,最后还是放弃。

然后公司使用的是Gerrit,我对这个也比较熟悉,准备再搭一个Gerrit,网上一查,这货居然比较Github还占用资源。稍后还折腾过Gitblit,Gitweb,功能太弱,都不满意。

最后决定使用Gitolite来搭建一个Git服务器了,一是占用资源少,二是ssh协议,安全快速,三是搭建、管理简单方便,四是功能强大。

Gitolite功能很强大,但是https://github.com/sitaramc/gitolite 上面的文档不多,只是介绍了最简单的用法。http://gitolite.com/gitolite/gitolite.html 上面才有完整的文档,为了方便自己,也方便以后其他人使用Gitolite搭建Git服务器,我把这个文档我觉得有用的部分做个教程。

Gitolite介绍

Gittolite是基于git搭建一个中央代码服务器,有以下特点:

  • 支持多个用户,多个仓库
  • 支持多个层次的权限控制,支持到仓库的branch和tag的权限访问
  • ssh安全访问协议
  • 不需要http服务器等其他依赖,更少的资源占用
  • 简单、灵活的管理

Gitolite安装成功后会创建一个名为gitolite-admin的特殊仓库,这个仓库里面管理着Gitolite的配置文件,在这些配置文件中可以添加删除用户、仓库,也可以定义一些权限控制规则。

认证与授权

Gitolite不做认证(authentication),只做授权(authorisation)。

  • 认证(authentication)。由ssh服务来认证访问账号的合法性。
  • 授权(authorisation)。授予某个账号的访问权限。

Gitolite安装和启动

安装Gitolite需要做一些准备工作,不过这些工作很简单。

安装Git

Gitolite是管理Git的仓库,所以必须要安装Git。

如果已经服务器上已经安装了Git,则就不必再安装了。

创建专有用户

Gitolite需要服务器上创建一个专有的用户账号,一般我们创建一个名为git或者gitolite的用户。例如我们创建一个git的用户账号,需要访问一个名为repo的仓库,那么访问的url为以下两种:

安装Gitolite

  1. 切换到git用户账号:su – git
  2. 安装SSH,一般来说服务器上都已经安装SSH了
  3. 获取Gitolite代码,git clone git://github.com/sitaramc/gitolite
  4. 创建Gitolite安装目录。mkdir -p ~/bin
  5. 开始安装。gitolite/install -to ~/bin
  6. 添加管理员公钥。这个管理员公钥就是对应着拥有管理代码仓库的权限,非常重要。把自己的公钥admin.pub上传到服务器,添加到Gitolite中。gitolite setup -pk admin.pub

升级Gitolite

也许以后可能升级Gitolite,这个也不麻烦。更新Gitolite的代码,然后重复安装里面操作,最后运行gitolite setup。

管理Gitolite

管理Gitolite也很简单,它是通过一个Git仓库来管理的。安装好Gitolite后,会默认生成一个gitolite-admin的仓库。管理员可以把这个仓库clone到本地:

这个仓库有两个目录:

  • keydir,存放用户认证的公钥文件目录
  • conf,存放Gitolite配置的文件的目录
    • gitolite.conf,gitolite配置文件

用户

添加用户本质是把该用户的公钥文件添加到gitolite-admin仓库中。比如想添加一个用户foo:

  1. 把foo的公钥文件重命名为foo.pub
  2. 把foo.pub文件放到gitolite-admin/keydir目录中,并提交到远程仓库

删除用户也类似,只不过把该用户的的公钥文件移出gitolite-admin仓库。

有时候一个用户有多个公钥文件。这种情况下,就需要把这些同名的公钥文件放到keydir不同的子目录下。比如foo用户的多个公钥文件如下放置:

  • keydir/home/foo.pub
  • keydir/laptop/foo.pub
  • keydir/desktop/foo.pub

只要这些公钥都是命名为foo.pub,在不同的目录下不冲突。

仓库

添加仓库

添加一个仓库很简单,编辑gitolite-admin仓库里面的gitolite-admin/conf/gitolite.conf即可。我们可以看下初始的gitolite.conf文件内容:

repo name,就是定义一个名为name的仓库。可以看到Gitolite里面有两个默认的仓库,gitolite-admin和testing。

下面的RW+     =   admin则便是这个仓库的权限控制规则,可以看到这个仓库只允许admin可读可写可管理。

我们可以用以下代码添加一个新的bar仓库:

我们在gitolite.conf文件中添加一个foo的仓库,实际存放在服务器上的仓库目录名是foo.git。这个新仓库只允许foo用户可读可写可管理。

你可以把两个具有一样的访问权限的仓库定义成一行,如下:

这样,a、b、c就是3个具有相同的访问权限的仓库了,foo用户可以读可写可管理,admin用户只能可读。

删除、重名仓库

删除仓库稍微麻烦一点:

  1. 从gitolite.conf删除仓库的定义
  2. 登陆到服务器,删除服务器上对应的仓库

重命名仓库也是如此,修改gitolite.conf文件,然后修改服务器上对应仓库的名字。

导入现有仓库

直接把一个仓库放入Gitolite仓库目录是不行的,它有几个要求:

  • 仓库必须是bare仓库
  • 仓库目录名必须以.git结尾
  • 仓库里面所有的文件和目录的归属(ownded)和可写于Gitolite用户账号。
  • 运行gitolite setup

用户组和仓库组

你可以把用户或者仓库定义成一个组,对这个组赋予某种属性,就是对组内所有的成员都赋予同样的属性。这对批量的处理某些问题很有帮助。

组名以@开头,如下定义一个3个成员的组:

也可以累积分别定义,效果跟上面一样:

你也可以把一个组放到另外一个组里面:

注意,后来添加到develpoers组的wally并不在staff组里面。

如下是个使用组定义仓库和它用户的例子:

特殊组

@all表示所有的仓库或者所有的用户。

访问权限

紧跟着一个仓库后面的就是这个仓库的访问权限规则,有以下几种权限:

  • R,表示可读权限
  • RW,表示fast-forward push分支,创建新分支和tag权限。不能回转、删除分支
  • RW+,可以做任何事情
  • -,拒绝访问

以下面的配置为例子:

  • alice 和teamleads组可以做任何事情
  • dilbert @devteam权限
    • 可以对/dev分支做任何事情
    • 可以fast-forward push分支,创建新分支和tag权限
    • 除了以v开头tag,可以创建其他tags
  • managers只能读仓库

你还可以创建一个仓库组,在同一个仓库组里面的仓库具有相同的权限,如下:

这样,有3个仓库foo、bar、zzq都在myrepos同一个仓库组里面,具有相同的访问权限。

gitolite.conf

gitolite.conf有两个重要的作用:定义仓库名和定义仓库的访问权限。

基本语法

  • 所有的东西都是用空格分隔
  • 可以使用#表示注释
  • 用户名和仓库名都是以字母开头,可以包含.、_、-。用户名还可以是电子邮件地址
  • 组名类似用户名,但不能是电子邮件地址
  • 仓库名可以包含/,用来表示目录结构

include其他配置

Gitolite允许你把配置放在另外的.conf文件里,然后在gitolite.conf把这些配置文件include进来就可以了。比如include “foo.conf”,就把foo.conf文件里面的配置包括进来了。

  • 可以用通配符表示,比如include “*.conf”
  • 可以包含子目录,比如include “foo/bar.conf”

发表评论

电子邮件地址不会被公开。 必填项已用*标注