Git 之六 - 使用 Gitolite 搭建 Git 服务器

Gitolite Github Repo

Gitolite 介绍

Gitolite 是一款 Perl 语言开发的 Git 服务管理工具,采用的是 SSH 协议并使用 SSH 公钥认证,能够通过配置文件对写操作进行基于分支和路径的精细授权。

安装环境说明

1
2
3
4
5
$ uname -a
Linux centos7 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

安装基础依赖包

1
2
3
4
5
# 切换到Root用户
$ su - root

# 安装依赖包
# yum install -y autoconf git gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel tree

创建 Git 用户

1
2
3
4
5
6
7
# 如果Git用户已存在则无需再创建,务必确认/home/git/.ssh/authorized_keys文件的内容为空或者不存在

# 创建Git用户
# adduser git

# 设置Git用户的密码
# passwd git

创建 Root 用户的 SSH 公钥 / 私钥对

1
2
3
4
5
6
7
8
9
10
11
# 进入Root用户家目录下的.ssh目录
# cd /root/.ssh

# 查看是否存在SSH公钥/私钥对
# ls -al

# 如果不存在SSH公钥/私钥对,则执行以下命令进行创建,然后一路回车到结束
# ssh-keygen

# 将Root用户的SSH公钥文件复制到Git用户的家目录下,建议公钥文件使用具有标识性的文件名称,便于多人协作开发时区分不同的客户端用户
# cp id_rsa.pub /home/git/sk.pub

安装 Gitolite

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 切换到Git用户
# su - git

# 确保当前位置是在Git用户的家目录(/home/git)下
$ pwd

# 更新Bash
$ source .bash_profile

# 创建一个名称为bin的目录
$ mkdir bin

# 克隆Gitolite源码
$ git clone git://github.com/sitaramc/gitolite

# 在bin目录下创建Gitolite符号链接,必须使用相对路径
$ gitolite/install -ln ~/bin

# 使用Root用户的SSH公钥文件安装Gitolite,在服务器中Gitolite通常是由一个非Root用户安装的,一般是使用Git用户
$ gitolite setup -pk sk.pub

# 安装完成后/home/git目录的结构如下
$ tree -L 1 /home/git
/home/git
├── bin
├── gitolite
├── projects.list
├── repositories
└── sk.pub

验证 Gitolite 是否安装成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 切换到Root用户
$ su - root

# 确保当前位置是在Root用户的家目录(/root)下
# pwd

# 测试从新安装的Gitolite服务器中克隆gitolite-admin仓库,终端会提示输入Root用户的密码,由于上面已经交换了Root用户的SSH公钥文件,因此只需要输入"yes",然后输入回车键即可
# git clone git@127.0.0.1:gitolite-admin

# 查看gitolite-admin仓库的目录结构,conf目录用于存放配置文件(授权文件),keyDir目录用于存放所有客户端用户的SSH公钥文件
# tree gitolite-admin
gitolite-admin
├── conf
│ └── gitolite.conf
└── keydir
└── sk.pub

gitolite-admin 仓库介绍

gitolite-admin 仓库用于 Git 管理员管理 Git 仓库与分配 Git 仓库权限,以后每次新增仓库、修改权限、更新用户 / 用户组,都需要在这个 clone 下来的 gitolite-admin 仓库下的 conf 目录中进行配置;同时将客户端用户的 SSH 公钥文件上传至 keydir 目录,SSH 公钥文件的文件名以客户端用户名来区分;然后将新增或修改的文件 push 到仓库服务器,push 完后可以看到 /home/git/repositories 下新创建的仓库。

Gitolite 管理示例 - 添加、修改仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 查看当前用户身份,确保当前用户身份是Root用户
# whoami

# 进入gitolite-admin仓库所在的目录
# cd /root/gitolite-admin

# 编辑Gitolite的配置文件,使用以下格式配置用户、用户组、仓库、权限等
# vim conf/gitolite.conf

# 配置用户组,组成员名称必须与keydir目录下的SSH公钥文件的文件名相同
@组名 = 用户名

# 配置仓库名/项目名,如果对应的仓库不存在,执行Push操作之后会自动创建并初始化仓库
repo demo

# 配置仓库权限,如果是多个用户组/用户名,则使用空格隔开
RW+ = @用户组/用户名

# 如果在Gitolite的配置文件中添加了新客户端用户的配置内容,则需要上传新客户端用户的SSH公钥文件到gitolite-admin/keydir目录下。在keydir目录下,客户端用户的SSH公钥文件的文件名必须与conf/gitolite.conf文件中指定的客户端用户名一致;例如用户zhangsan,其SSH公钥文件的文件名必须是zhangsan.pub。这里的作用类似在Linux中配置SSH免密码登录。

# 配置仓库签名(只需在首次执行Push操作之前进行配置)
# git config user.name gitolite-root
# git config user.email xxx@qq.com

# 执行Push操作,使配置生效
# git add --all
# git commit -am 'update gitolite config'
# git push origin master

# 如果上述配置中包含了新仓库的配置内容,那么成功执行Push操作之后,可以在/home/git/repositories目录下看到新创建的仓库目录,例如demo.git
# ls -al /home/git/repositories

Gitolite 管理示例 - 删除仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看当前用户身份,确保当前用户身份是Root用户
# whoami

# 进入gitolite-admin仓库所在的目录
# cd /root/gitolite-admin

# 编辑Gitolite的配置文件,删除对应仓库的相关配置内容,例如“repo demo”
# vim conf/gitolite.conf

# 执行Push操作
# git add --all
# git commit -am 'update gitolite config'
# git push origin master

# 在服务器上手动删除/home/git/repositories目录下对应的仓库目录,删除示例如下:
# rm -rf /home/git/repositories/demo

Git 客户端(远程客户端)连接 Gitolite 服务器的步骤总结

  1. Git 管理员在 gitolite-admin 仓库里,配置客户端用户访问对应仓库的权限
  2. 客户端本地生成 SSH 公钥文件,并交由 Git 管理员上传到 gitolite-admin/keydir 目录下
  3. 客户端直接使用 Git 命令克隆对应的远程仓库,例如: git clone git@ip:repo-name
  4. 其他 IDE (例如 Eclipse) 克隆对应的远程仓库,可以直接使用地址: git@ip:repo-name
  5. git@ip:repo-name,其中 ip 是 Gitolite 服务器的 IP 地址,repo-name 是 Git 远程仓库的名称

Gitolite 防火墙配置说明

使用 Gitolite 搭建 Git 服务器,由于 Gitolite 采用的是 SSH 协议,只需要确保系统开启 SSH 服务,并且防火墙开放了 SSH 端口(默认 22)即可。

解决 Gitolite 安装之后,无法使用 git 用户进行 SSH 远程登录的问题

当安装 Gitolite 后,Gitolite 出于安全问题直接禁用了 git 用户的 SSH 登录权限,因此是无法直接使用 git 用户远程 SSH 连接到服务器的,默认会提示以下错误信息。解决方法是先通过其他 Linux 用户 SSH 远程连接到服务器,然后执行命令”su - git” 切换到 git 用户。

1
2
3
# ssh git@192.168.1.1
PTY allocation request failed on channel 0
hello centos7, this is git@192.168.1.1 running gitolite3 v3.6.10-2-g64aa53b on git 1.8.3.1