工具与平台
平台: Ubuntu Server 14.04
工具: gitolite
搭建步骤
1、安装 git 和 openssh-server
假设服务器系统 Ubunut 上有有一个名为 admin
的管理员用户,在 admin 用户下安装 git
和 openssh-server
sudo apt-get install git
sudo apt-get install openssh-server
2、创建 git 用户
创建一个名为 git 的用户,用于管理 git:
// 添加一个名为 git 的用户,创建同名用户组,设置其可用 shell 登录,shell是 /bin/bash
sudo adduser --system --shell /bin/bash --group git
git这个名字是可以更改的,但一般都是取名为 git。
有些系统只允许特定的用户组(ssh用户组)可以通过 ssh 协议登录,所以将 git 用户添加到 ssh 用户组中:
sudo adduser git ssh
给 git 用户设置密码:
sudo passwd git
3、在 admin 用户下生成 ssh key
还是在 admin 用户下,生成 ssh key:
ssh-keygen -t rsa // 以 rsa 方式加密
如果不想改变默认存储路径,不设置 ssh 通信时的密码,只要一路回车即可。
当出现这个画面,表示 ssh key 已经生成成功。
默认 ssh key 存储在 ~/.ssh
文件夹中,我们将其中的公钥 id_rsa.pub
复制到 git 用户主目录中待用,并重命名为 admin.pub
:
sudo cp ~/.ssh/id_rsa.pub /home/git/admin.pub
4、在 git 用户下安装 gitolite
切换到 git 用户:
su git
切换到 /tmp
目录下,从 github 上克隆 gitolite 的源码:
cd /tmp
git clone https://github.com/sitaramc/gitolite.git
在 git 用户的主目录下新建 bin
文件夹,准备用来安装 gitolite:
cd ~
mkdir bin
安装 gitolite:
/tmp/gitolite/install -to ~/bin
利用 admin.pub
来初始化 gitolite 初始仓库:
~/bin/gitolite setup -pk ~/admin.pub
输出的信息告诉我们,gitolite 帮我们初始化了两个空仓库:gitolite.admin.git
和 testing.git
。其中 testing.git
只是生成了给我们做测试之用,而 gitolite.admin.git
是用来管理的,非常重要。
由于我们用 admin 用户的的 ssh key 来初始化 gitolite 初始仓库,因此 admin 用户就是管理员,它可以用来增加删除仓库,添加用户,进行权限管理等。
切换到 admin 用户下,尝试用 ssh 登录 git 用户:
su admin
ssh git@127.0.0.1
上面的信息表示 admin 用户目前对 gitolite-admin
和 testing
仓库有读写操作权限。
ssh连接自动关闭,这是 gitolite 所起的作用,禁止 git 用户使用 shell 登录,以防没有权限的人登录 git 用户破坏里面的代码仓库。
仓库管理
由于 admin 用户是 gitolite 的管理员,因此,我们在 admin 用户下,便可以对仓库进行管理。管理方式也是通过 git clone /git push 等操作的来进行的。
首先将 gitolite-admin.git
仓库克隆下来:
git clone git@127.0.0.1:gitolite-admin.git
由上图可知,gitolite-admin
文件夹下面还有两个文件夹 conf
和 keydir
。其中 conf
文件夹下面存放了仓库配置文件 gitolite.conf
。keydir
里面存放各个用户的 ssh 公钥文件。
打开 gitolite.conf
,里面的内容如下图所示,每个repo表示一个仓库,下面表示特定的用户有特定的权限。此处可以用来进行权限控制。
假设此时有两个用户 Tom 和 Jack 需要利用这个git服务器合作开发一个名为 Lake 的项目。则首先 Tom 和 Jack
需要在它们各自的电脑上生成 ssh key,然后将其中的公钥 id_rsa.pub 改名为 Tom.pub 和 Jack.pub
,并添加到服务器上 admin 用户下的 gitolite-admin/keydir/
目录下。
然后管理员需要编辑 gitolite.conf
文件,创建新的仓库,并给 Tom 和 Jack 读写的权限。
现在这些配置其实还不能生效,只有把本地(admin 用户下)对 gitolite-admin
的修改再推送到远程服务器(git 用户下),修改才能生效:
// 在 ~/gitolite-admin/目录下
git add -A
git commit -m "create repo:Lake, add user:Tom&Jack"
git push origin master
这样,Tom 和 Jack 就对远程仓库 Lake 有了读写权限,就可以进行合作开发了。