使用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 gitolite@192.168.1.18:git1.pub
- 在服务器端下载
gitlite
git clone https://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 gitolite@192.168.1.18:gitolite-admin
管理库中有两个目录,
conf/
和keydir/
。conf/gitolite.conf
用于Git项目配置,访问权限设置。keydir/
用于存储用户的SSH public key(公钥)。
仓库的创建通过编辑
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..613f720master -> 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 gitolite@192.168.1.22: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 gitolite@192.168.1.22:repo2.git
- 推送本地仓库
git push origin master
权限规则示例
repo foo
RW+=alice
-master=bob
-refs/tags/v[0-9]=bob
RW=bob
RWrefs/tags/v[0-9]=carol
R=dave
- alice对foo仓库有最高权限,创建、推送、删除、回退、覆写等
- bob对非master开头的分支和非v+数字开头的标签进行创建和推送
- carol能够创建以v+数字开头的标签。
- dave可以克隆和
fetch
(拉取)
gitolite.conf
类似于变量的形式管理组,并且非常灵活
@admins=macken steven@engineers = macken steven wally alice@staff = @admins @engineers@interns=ashokrepo secret
RW=@staffrepo 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 gitolite@192.168.1.18:gitolite-admin
Cloning into 'gitolite-admin'...
gitolite@192.168.1.18'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库}。
- https://www.zhihu.com/questio...
- https://segmentfault.com/a/11...
参考
- 使用Gitolite搭建轻量级的Git服务器
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 六步搭建ES6语法环境
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用