Fedora 20 安装gitolite

“git本地化之后,可能会用到权限管理,gitolite就是一个强大的权限管理工具”

gitolite安装先决条件

关于gitssh登录的基础知识,网上已经有很多很好的文章,在这里就不再加以赘述了。

安装git

要安装gitolite,首先要安装git:

1
sudo yum install git

创建git用户组和git用户

然后,需要新建用户和用户组git,以方便所有用户使用git账户进行登录:

1
2
3
4
5
6
7
8
# 添加git用户组
sudo groupadd git

# 创建新用户git并将其添加到用户组git之中
sudo adduser -g git git

# 修改用户git的密码
sudo passwd git

创建管理员密钥

由于初始化gitolite需要一个管理员的公钥,所以需要创建一个key:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 为名为“yourname”的账户生成相应的key
ssh-keygen -t rsa -C "yourname"

# 选择存储key的位置及key文件名称
Enter file in which to save the key (/home/user/.ssh/id_rsa): /home/user/.ssh/yourname
Enter passphrase (empty for no passphrase): #为你的key创建密码,一般不需要,回车即可
Enter same passphrase again: #回车即可

# 最后输出类似的结果表示key生成成功
...
The key's randomart image is:
+--[ RSA 2048]----+
| . . |
| = . |
| . o E |
| o o = o |
| o o = S |
| . + B. |
| . =o. |
| .o. |
| .oo. |
+-----------------+

将公钥上传到git用户中

生成key之后,需要将其上传到git用户之中:

1
2
3
4
5
# 将公钥上传到git用户中
scp /home/user/.ssh/yourname.pub git@localhost:/tmp

ECDSA key fingerprint is 77:ad:e9:c2:e3:9f:bc:eb:38:42:e8:24:4f:b4:4a:a9.
Are you sure you want to continue connecting (yes/no)? yes

若此时出现错误:

1
2
ssh: connect to host 127.0.0.1 port 22: Connection refused
lost connection

则说明ssh服务没有打开,需要开启ssh服务:

1
2
3
4
5
# 开启ssh服务
sudo service sshd start

# 开机启动ssh服务
sudo systemctl enable sshd.service

除此之外,要让局域网内的用户能够访问git服务器,需要关闭防火墙:

1
2
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service

安装gitolite

进入git用户并创建bin目录

安装gitolite的操作需要在git用户下进行,首先需要切换到git用户:

1
su git

输入密码后,需要切换到git用户的用户根目录下创建bin文件夹:

1
2
3
4
cd ~

# 创建bin文件夹是为了将gitolite安装到其中便于认知和管理
mkdir bin

克隆gitolite并安装

我们需要从github中克隆gitolite的官方仓库进行安装:

1
2
3
4
5
# 克隆gitolite仓库
git clone git://github.com/sitaramc/gitolite

#将gitolite安装到bin目录下
./gitolite/install -to ~/bin/

安装gitolite的时候,可能会出现错误:

1
Can't locate Data/Dumper.pm in @INC

这是由于没有安装相应的perl包所导致的,需要切换回非git用户进行安装,使用命令:

1
2
3
4
# 使用CPAN安装perl包
sudo perl -MCPAN -e shell

cpan[1]> install Data::Dumper

如果是首次使用CPAN会进行一定的配置,在询问是否自动配置处输入yes即可。

使用CPAN时可能出现错误:

1
Can't locate CPAN.pm in @INC

这是由于没有安装CPAN出现的错误,使用命令:

1
sudo yum install perl-CPAN

安装完成后,应该会自动集成Data::Dumper包。

回到git用户,安装gitolite后,bin文件夹中会出现相应的文件,到此,gitolite就安装成功了。

使用公钥初始化gitolite

完成安装gitolite后,需要使用刚才上传的公钥将gitolite进行初始化,这个公钥的所有者将成为gitolite的第一个管理员, 在git用户根目录下,使用命令:

1
2
3
4
5
6
7
8
9
# 使用yourname.pub对gitolite进行初始化
./bin/gitolite setup -pk yourname.pub

初始化空的 Git 版本库于 /home/git/repositories/gitolite-admin.git/
初始化空的 Git 版本库于 /home/git/repositories/testing.git/
WARNING: /home/git/.ssh missing; creating a new one
(this is normal on a brand new install)
WARNING: /home/git/.ssh/authorized_keys missing; creating a new one
(this is normal on a brand new install)

到此为止,gitolite的初始化已经完成。

添加gitolite的用户和仓库

不要手动在git服务器中添加新用户或者新仓库。因为gitolite的用户,仓库和权限规则都是使用一个名为gitolite-admin的特殊仓库进行维护的,想要进行修改,就需要通过修改该仓库的文件并push到服务器当中。

要添加用户和仓库,首先需要退出git用户后,将gitolite-admin克隆到本地:

1
2
3
4
5
# 退出git用户
exit

# 将gitolite-admin仓库克隆到本地
git clone git@localhost:gitolite-admin

进入gtiolite目录后,可以看到两个子目录confkeydirconf/gitolite.conf用于修改仓库,用户及其权限,keydir用于存放用户的公钥。

为了增加新用户alicebobcarol, 首先需要获取他们的公钥(alice.pub,bob.pub和carol.pub),并添加到keydir文件夹当中。

为了增加新仓库foo,并赋予这些用户不同的权限,修改conf/gitolite.conf文件:

1
2
3
4
repo foo
RW+ = alice
RW = bob
R = carol

进行修改之后,需要将改动上传到服务器使其生效:

1
2
3
4
git add conf
git add keydir
git commit -m "added foo, gave access to alice, bob, carol"
git push

gitpush操作成功后,gitolite将会把新用户添加到服务器的~/.ssh/authorized_keys文件中,然后会新建一个名为foo的空仓库。

进阶操作

权限管理

gitolite的权限管理非常强大,之前展示的只是最简单的权限管理,下面是更加深入一些的管理:

1
2
3
4
5
6
7
repo foo
RW+ = alice
- master = bob
- refs/tags/v[0-9] = bob
RW = bob
RW refs/tags/v[0-9] = carol
R = dave

下面对上述规则进行阐述:

  • alice能够对仓库进行所有的操作。

  • bob能够创建和推送任何名字不为master的分支,并能够添加任何不以v+数字开头的tag

  • carol能够添加任何以v+数字开头的tag

  • dave能够进行clonefetch操作。

更加详细的权限管理请看官方文档

gitolite允许创建用户组:

1
2
3
4
5
6
7
8
9
@staff      =   alice bob carol
@interns = ashok

repo secret
RW = @staff

repo foss
RW+ = @staff
RW = @interns

用户组是可以堆叠的,下面的写法和上方的@staff是相同的:

1
2
@staff      =   alice bob
@staff = carol

同样的,也可以将用户组添加到另一个用户组当中:

1
@all-devs   =   @staff @interns

此外,gitolite有一个特殊的用户组,名为@all,他表示所有的用户。