在 ubuntu 搭建基于 Gitolite 的 Git 服务器
Sep 26, 2017
工作需要搭建一个支持 Repo 管理的私有 Android 源码镜像,因为 Repo 工具是基于 Git 服务器的,所以也实践了一下 Git 服务器的安装。
Git 服务器的选择
搭建 Git 服务器有多个选择,除了 Gitolite,还有 Gitosis,Gerrit,Gitlab 等等。
Gitolite 使用纯文本配置文件(plain text config file),这一点和 Gitosis 一样(如果我没理解错的话),网上也有不少基于文章介绍如何基于 Gitosis 建立 Android 源码镜像。不过,Gitosis 自 2015 年之后已经没再更新了,相当于遗弃了,所以不建议使用 Gitosis。
Gerrit 和 Gitlab 使用数据库保存数据,Gerrit 支持 Code Review,Google 管理 Android 源码正是使用 Gerrit。Gitlab 还有基于 Web 的 GUI,都很强大,也是不错的选择。
此外,流行的 Git 服务器还有 Gogs,同样提供可视化的 web GUI,曾作公司内部的 Git 服务器使用,体验不错。
搭建 Gitolite 的系统环境
官方文档 给出非常详细的指引。
这里准备了一台计算机作为服务器安装 gitolite ,一台计算机作为管理服务器的客户端。
- 服务端 ubuntu 16.04 LTS, IP: 192.168.8.4
- 客户端 MacOS Sierra,IP: 192.168.3.35
先在服务器上安装 git
,perl
,openssh
,可以使用 root 用户进行操作:
apt-get install git perl openssh-server
创建 git 用户
安装完成后,创建用户 git,并建立家目录 /home/git :
useradd -md /home/git/ git
有关不少文章在创建用户 git 之后,会使用 passwd git
来设置该用户的密码。
个人不建议这样做,因为不设置密码的话,只有 root 才可以使用 su - git
登录 git,这样可以避免服务器上的其它用户登录 git 这个账户。
客户端传送公钥
在客户端计算机(192.168.3.35)生成公钥和私钥:
ssh-keygen
各种选择都按回车跳过,最后会在 ~/.ssh/
目录生成 id_rsa
和 id_rsa.pub
将 id_rsa.pub
发送到服务端(192.168.8.4):
scp ~/.ssh/id_rsa.pub root@192.168.8.4:~/
id_rsa.pub
将在安装 gitolite 时使用,他可以将客户端计算机注册为 gitolite 的管理员。
服务端安装 gitolite
在服务端(192.168.8.4),把 id_rsa.pub
转移到 git 的 $HOME 目录
mv id_rsa.pub /home/git/
使用 su - git
登录 git。确认 ~/.ssh/authorized_keys
不存在或者内容是空的,否则把它删除。
下载 gitolite 到服务端:
git clone https://github.com/sitaramc/gitolite
mkdir -p $HOME/bin
gitolite/install -to $HOME/bin
安装 gitolite 使用,并将客户端计算机作为 gitolite 的管理员:
gitolite setup -pk YourName.pub
这样就算安装完成了。
曾经在安装 gitolite 时遇到 FATAL: split conf set, gl-conf not present for....
的错误,反复重试之前的步骤都没能解决。
后来怀疑应该是之前装了 gitosis,存在冲突。
最后使用 userdel -r git
,删掉 git 账户,重新按上述步骤操作一遍才安装成功。
gitolite 的管理
gitolite 添加新的仓库和用户时,不能在服务器上直接操作。
所有 gitlote 的用户、仓库和访问规则,都由一个特殊的仓库 gitolite-admin
来管理,将这个仓库 clone 到你的客户端计算机(192.168.3.35),即生成 id_rsa.pub
的那部计算机:
git clone git@192.168.8.4:gitolite-admin
上述操作应该是直接将 gitolite-admin 下载到客户端计算机上的,如果出现请求输入密码的情况,那就说明安装过程出错了,需要重新安装。
cd gitolite-admin
,里面有两个子目录 “conf” 和 “keydir”。
添加新成员和新仓库
假设你要往 gitolite 服务器添加新成员 alice,bob, carol,操作流程如下:
首先,让三人各自在其计算机上使用ssh-keygen
生成 id_rsa
和 id_rsa.pub
(注意,一直使用回车就好,不要改名字),把各自的 id_rsa.pub
发送到客户端计算机(192.168.3.35) gitolite-admin/keydir
目录下,并重命名为 alice.pub,bob.pub,carol.pub 。
假设要添加新的仓库名为 “foo”,并给予上述三人不同权限,在 gitolite-admin/conf/gitolite.conf
添加下列代码:
repo foo
RW+ = alice
RW = bob
R = carol
RW+ 表示 alice 有权限对 foo 做任何操作,包括创建、读写、删除、push、rewind 等。
RW 表示 bob 可以对 foo 有读写的权限。
R 表示 carol 可以对 foo 有只读权限,可以 clone/fetch。
SSH 和 Git Daemon
Gitolite 没有提供公开访问仓库的方法,所有的访问都必须通过 SSH ,也就是说,每个用户要 clone 或者修改托管在 Gitolite 上的仓库,都必须先在 gitolite-admin 仓库里存放上自己 SSH 公钥。
那如果真的有需要公开某个仓库的权限要怎么办,许多文章都提到了 git-daemon 。不过,我个人在 ubuntu 和 centos 上都尝试过 git-daemon 来公开仓库权限,但都没有成功。因为不是项目必须,所以也没有再深入研究。