使用Gitolite搭建Git服务器
Git服务的管理工具,主要有如下几种。
-
Gitosis– 轻量级, 开源项目,使用SSH公钥认证,只能做到库级的权限控制。目前项目已经停止开发,不再维护。
-
Gitolite – 轻量级,开源项目,使用SSH公钥认证,能做到分支级的权限控制。
-
Git + Repo + Gerrit – 超级重量级,集版本控制,库管理和代码审核为一身。可管理大型及超大型项目。Android平台使用的就是这种方案。
-
GitLab
-是GitHub的开源版本,使用和配置比较复杂,适合大型团队、资源密集型开发的管理工具
Gitolite
使用perl语言编写,维护和更新比较积极,下面测试使用Gitolite搭建Git服务器。
Gitolite的安装
- 新建用户Git服务器用户
gitolite
(用于存放管理Git公钥和仓库)
adduser gitolite
- 使用
gitolite
用户登陆服务器
$ su - gitolite
密码:
- 确保家目录
~/.ssh/authorized_keys
是空的或者不存在
一般新建用户~/.ssh/
目录是不存在的。
- 客户端生成ssh密钥,并将公钥上传到服务器的
Gitolite
用户家目录下
$ ssh-keygen -t rsa
生成路径会在ssh-kengen执行后给出,也可修改。windows下生成路径默认位于C:/user/用户名/.ssh
下。
- 上传客户端的公钥到
gitolite
用户家目录下
$ pscp C:/Users/win7hostsver/.ssh/id_rsa.pub [email protected]:git1.pub
- 在服务器端下载
gitlite
git clone //github.com/sitaramc/gitolite
- 创建
bin
目录,并将gitolite
安装到bin目录下
mkdir -p $HOME/bin
gitolite/install -to $HOME/bin
- 将上传的公钥
git1.pub
设置为gitolite
的超级管理员
$HOME/bin/gitolite setup -pk git1.pub
初始化空的 Git 仓库于 /home/gitolite/repositories/gitolite-admin.git/
初始化空的 Git 仓库于 /home/gitolite/repositories/testing.git/
WARNING: /home/gitolite/.ssh/authorized_keys missing; creating a new one
(this is normal on a brand new install)
此时,gitolite
会初始化两个仓库,同时创建authorized_keys
文件
也可以将
gitolite
命令路径加入到系统环境变量,这样可以在任何路径使用gitolite
- 客户端克隆授权管理仓库
$ git clone [email protected]:gitolite-admin
管理库中有两个目录,conf/
和keydir/
。
-
conf/gitolite.conf
用于Git项目配置,访问权限设置。 -
keydir/
用于存储用户的SSH public key(公钥)。
配置Git服务器的项目
添加新的Git项目仓库到本地
仓库的创建通过编辑gitolite-admin/conf/gitolite.conf
即可,然后将配置后的文件上传服务器。
gitolite.conf
中添加如下两行,新建一个repo1的仓库:
repo repo1
RW+ = @all
gitolite.conf
管理仓库有三种权限,RW+、RW、R
权限可以赋值给
@all
所有有用户;或添加到\keydir\
目录中的公钥对应的某一个用户(公钥文件的名字为RW+
值)如
git1.pub
公钥文件,RW+ = git1
- 添加并提交修改到
gitolite-admin
git add .
git commit -m "added repo1 gave access to all"
[master 613f720] added repo1 gave access to all
1 file changed, 1 insertion(+), 1 deletion(-)
- 推送到远程服务器,
gitolite
会在服务器创建对应的git仓库
git push
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (8/8), 703 bytes | 175.00 KiB/s, done.
Total 8 (delta 1), reused 0 (delta 0)
remote: 初始化空的 Git 仓库于 /home/gitolite/repositories/repo1.git/
To 192.168.1.22:gitolite-admin
f68d497..613f720 master -> master
- 服务器端
repositories/
仓库库目录下会多出一个空仓库repo1
$ ls -al repositories/
总用量 20
drwx------ 5 gitolite gitolite 4096 5月 7 21:10 .
drwxr-xr-x 10 gitolite gitolite 4096 5月 7 21:10 ..
drwx------ 8 gitolite gitolite 4096 5月 7 21:10 gitolite-admin.git
drwx------ 7 gitolite gitolite 4096 5月 7 21:10 repo1.git
drwx------ 7 gitolite gitolite 4096 5月 7 21:10 testing.git
- 客户端直接克隆
$ git clone [email protected]:repo1.git
Cloning into 'repo1'...
warning: You appear to have cloned an empty repository.
本地现有仓库添加到服务器
若本地已有仓库repo2,将其添加到服务器
gitolite.conf
中配置仓库repo2
repo repo2
RW+ = git1
新用户要将其公钥添加到
/keydir
目录
- 添加、提交和push
git add .
git commit -m "added repo2 gave access to git1"
git push
- 本地配置远程服务器
git remote add origin [email protected]:repo2.git
- 推送本地仓库
git push origin master
权限规则示例
repo foo
RW+ = alice
- master = bob
- refs/tags/v[0-9] = bob
RW = bob
RW refs/tags/v[0-9] = carol
R = dave
-
alice对foo仓库有最高权限,创建、推送、删除、回退、覆写等
-
bob对非master开头的分支和非v+数字开头的标签进行创建和推送
-
carol能够创建以v+数字开头的标签。
-
dave可以克隆和
fetch
(拉取)
组groups管理
gitolite可以通过用户组的方式进行管理
gitolite.conf
类似于变量的形式管理组,并且非常灵活
@admins = macken steven
@engineers = macken steven wally alice
@staff = @admins @engineers
@interns = ashok
repo secret
RW = @staff
repo foss
RW+ = @admins
RW = @interns
- 同时可以使用正则对分支和标签进行匹配授权
RW int$ = @interns # @interns组只对以“int”结尾的分支有创建和推送权限
RW eng- = @engineers # @engineers组只对以“eng-”开头的分支有创建和推送权限
RW refs/tags/rc[0-9] = @engineers # @engineers组只对以“rc[0-9]“开头的标签有创建和推送权限
RW+ = @admins # @admins组则对仓库有最高权限
遇到的报错
$ git clone [email protected]:gitolite-admin
Cloning into 'gitolite-admin'...
[email protected]'s password:
fatal: 'gitolite-admin' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
如上提示,需要输入密码。
需要安装openssh
,并将gitolite
用户添加在sshusers
组中,有的服务器可能是ssh
组。
SSL(Secure Sockets Layer)安全套接字层,主要用来加密数据传输
SSH (Secure SHell)安全shell,实现对所有传输的数据进行加密。这样“中间人”攻击方式就不可能实现了,并且数据经过压缩,传输速度快。
openssh依赖于openssl,openssl是一个安全套接字层密码库,包括主要的密码算法、常用密钥和证书封装管理及SSL协议。
OpenSSH是SSH协议的实现,实现过程中,需要用到密钥交换算法,对称/非对称加密算法,Mac算法,随机数算法。会用到OpenSSL的libcrypto库{openssl还有libssl库}。
计算机领域的Cookbook指的是实用经典案例的意思,是对一些普遍性问题的解决方案的总结和整理。