git服务器搭建及gitolite 基本语法

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有指定其他的就把其加到对应的文件就行)

你可能感兴趣的:(git服务器搭建及gitolite 基本语法)