2015年在Ubuntu 14.04.4 LTS trusty版本上用gitolite搭建git服务器时写的一个记录手册。今天整理了一下,发出来:)
1 ssh公钥和私钥的生成
ssh-keygen -t rsa
生成的密钥默认存放位置(Linux和window系统都一样)
~/.ssh
生成两个密钥id_rsa(私钥) 和 id_rsa.pub(公钥)
公钥需要提供给需要默认登录的服务器做授权用,授权之后,不用每次登录的时候都需要输入密码,服务器会用公钥自动进行判断是否授权。
2 gitolite安装
- 创建一个给git用的帐号这里用git,当然也可以选一个自己更喜欢的
useradd -m git
- 给帐号创建密码
passwd git
- 切换到git帐号
su git
- 下载并安装
git clone git://github.com/sitaramc/gitolite
mkdir -p $HOME/bin
gitolite/install -to $HOME/bin
- 把新的bin目录加到PATH
vim ~/.bashrc
在末尾加入下面这一行,保存并退出
export PATH=/home/git/bin:$PATH
重新载入.bashrc
source .bashrc
- 增加管理员公钥
这里以zgk用户为例。把zgk用户home目录下 ~/.ssh目录下的 id_rsa.pub改名为zgk.pub并放到git的~目录下
gitolite setup -pk zgk.pub
- 装好之后版本库存储位置
/home/git/repositories
- 刚装完之后该目录下有两个仓库
gitolite-admin.git
testing.git
其中gitolite-admin.git是给管理员用来增减用户,新建版本库,和开放相应权限的地方。其实它就是一个git的仓库。管理员如果需要修改相关的配置,可以先把该仓库clone到自己的目录,修改完之后在push到服务器,修改就能生效。
而 testing.git就是一个测试的仓库,可以给不熟悉git的新手用来练练手它的权限是对所有人开放的。
- 测试安装是否成功
切换到zgk用户
su zgk
git clone [email protected]:gitolite-admin
#或者
git clone [email protected]:testing
都可以不用密码clone下来说明已经安装成功
如果需要加repositories前缀才能clone下来(git clone [email protected]:repositories/gitolite-admin),说明密钥可能有问题
- 增加windows下tortoisegit新用户zgkxp
这一步不是必须的,看自己是否需要在Windows下面操作git仓库,如果不需要就跳过。
生成密钥对
ssh-keygen -t rsa
服务器下zgk用户家目录
git clone [email protected]:gitolite-admin
把公钥改名为zgkxp.pub并放到gitolite-admin/keydir目录下
git add .
git commit -m “add user zgkxp”
git push
添加完毕
windows下右键打开git bash去登录服务器x.x.x.x(git服务器内网ip)
git clone [email protected]:testing
如果可以clone下来并且不需要密码输入说明已经添加成功
- 删除用户
把gitolite-admin/keydir目录下对应的用户删除掉在push到服务器就会把相应的用户删除
3 配置文件的语法简单介绍(conf/gitolite.conf)
用来管理,代码库的创建,控制用户对相关代码库的访问权限
具体可参考官网手册,http://gitolite.com/gitolite/conf.html
3.1 基本语法
(1)注释,以“#”作为注释的开发
(2)没有续行符“\”
(3)所有的东西都是用空格作为分隔符(不用逗号,分号等)
(4)用户名和代码库名可以包含"."、"_"、"-"等,代码库可以包含"/",用户名可以有“@”
(5)组名必须以@开始
3.2 组的定义
用户组和代码库组定义是一样的两者没差别。
- 简单的例子定义了一个组
@developers = dilbert alice wally
- 组的值是累积的所以也可以按下面这么定义,和上面的一样
@developers = dilbert
@developers = alice
@developers = wally
- 组的定义可以嵌套,但值是立即展开的,也就是说后面定义的值,不会在加的嵌套的组里面
@developers = dilbert alice
@interns = ashok
@staff = @interns @developers
@developers = wally# wally 用户并不属于 @staff 组
- 正常使用的一个例子
@developers = dilbert alice wally
@foss-repos = git gitoliterepo @foss-repos
RW+= @developers
@all是一个特殊组,它可以包括所有的用户或者所有的代码库
3.3 访问规则
访问规则一般由四部分组成
代码仓库名, 用户名, 操作, 和ref
(1)"repo"行
可以跟一个或者多个代码仓库,也可以跟组名,或者用正则表达式也可以。
(2)规则行
从"repo"开始到下一个"repo"出现之前的行都属于规则行,一般是
权限域 refex = 用户名或者组名等
repo foo bar
RW+= alice @teamleads
- master = dilbert @devteam
- refs/tags/v[0-9] = dilbert @devteam
RW+ dev/ = dilbert @devteam
RW= dilbert @devteam
R= @managers
- 权限域里常用的权限
- R, 只读
- RW, 允许 push 一个分支 branch, 或者创建一个 branch/tag
- RW+, 可以快速推送, 倒回或者删除 branches or tags
- - 拒绝访问
(3)refex
用来匹配代码仓库的引用(ref),一般使用正则表达式来表示
如果没有指定refex,则是以refs/.*作为默认值,比如
RW = alice
如果不是以refs/作为开始,则认为以refs/heads/开始,比如
RW master = alice# becomes 'refs/heads/master' internally
如果是对tag进行限制,则必须写全
RW refs/tags/v[0-9] = bob
refex默认开头是固定的,但是结尾可以随意匹配,换句话说就是有正则表达式的“^”在开头但是没有“$”在结尾,比如只指定master的话,下面这些对它都匹配
refs/heads/master
refs/heads/master1
refs/heads/master2
refs/heads/master/full
而对refs/tags/v[0-9], v1 , v12, v1.2,v12345这些都是对的。
如果你不想随意匹配的话,那在表达式后面加个$就行了,比如
RW master$ = alice
(4)需要注意的是=后面的用户名或者组名不能使用正则表达式来表示。
一个例子:
# managers should be able to read any repo
repo @all
R= @managers# ...other rules for other repos...
repo foo bar
RW+ = alice @teamleads
- master = dilbert @devteam
- refs/tags/v[0-9] = dilbert @devteam
RW+ dev/ = dilbert @devteam
RW = dilbert @devteam
R = @managers
补上默认值,等效于下面
1 # managers should be able to read any repo
2 repo @all
3 R refs/.* = @managers
4
5 # ...other rules for other repos...
6
7 repo foo bar
8
9 RW+ refs/.* = alice @teamleads
10 - refs/heads/master = dilbert @devteam
11 - refs/tags/v[0-9] = dilbert @devteam
12 RW+ refs/heads/dev/ = dilbert @devteam
13 RW refs/.* = dilbert @devteam
14 R refs/.* = @managers
(5)规则累积
repo 不一定是在一处要全部指定完,可以在别处补充,也可以被其它repo间接补充
比如
repo foo # ...some rules...# ...other repos and rules...
repo foo # ...more rules for foo...
# managers should be able to read any repo
repo @all
R= @managers
# anyone can clone open source repos
repo @FOSS
R= @all
3.4 规则检查
用户dilbert 对foo代码仓库的任何ref(any)的W权限检查
gitolite access -s foo dilbert W any
类似的其他检查
gitolite access -s foo dilbert W xyz
gitolite access -s foo dilbert + refs/heads/xyz
4 增加、移除、重命名一个代码仓库
服务器下zgk用户家目录
git clone [email protected]:gitolite-admin
编辑gitolite-admin/conf目录下gitolite.conf 文件
- 比如添加一个bar仓库(conf语法可以参考上一节的介绍)
repo bar
RW+= alice
git add .
git commit -m “add user zgkxp”
git push
添加完毕
要移除一个代码仓库,类似要编辑gitolite.conf 文件,删除对应的行并提交。但服务器的代码仓库并不会自动移除需要自己手动去移除。
重命名一个仓库按下面顺序(注意顺序)
(1)到服务器上把对应的仓库名字改掉,注意要保留“.git”后缀
(2)改变gitolite.conf中仓库的名字,并提交到服务器
附录1 SSH背景知识
ssh主要是用RSA进行加密的,RSA是非对称的,什么是非对称,就是你加密的密钥和解密的密钥用的不是同一个密钥,用RSA就必须用到两个密钥一个叫公钥(加密用),一个叫私钥(解密用)。
客户端用户和服务器大致的通信过程
客户端[客户端的私钥,解 密]<--------------服务器[客户端给的公钥,加密]
客户端[服务器给的公钥,加密]-------------->服务器[服务器的私钥,加 密]第一次连接
请求
客户端[公/私钥]----------------->服务器[公/私钥]
服务器公钥
客户端[公/私钥]<-----------------服务器[公/私钥]
客户端公钥
客户端[公/私钥]------------------>服务器[公/私钥]
- 客户端公/私钥一般存放的位置:
私钥 ~/.ssh/目录
公钥 ~/.ssh/know_hosts/目录
服务器公/私钥一般存放的位置:
/etc/ssh/ssh_host*自动授权登录:把公钥加到authorized_keys文件(默认是该文件,如果sshd_config的AuthorizedFile有指定其他的就把其加到对应的文件就行)