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 git@127.0.0.1:gitolite-admin
#或者
git clone git@127.0.0.1:testing

都可以不用密码clone下来说明已经安装成功

如果需要加repositories前缀才能clone下来(git clone git@127.0.0.1:repositories/gitolite-admin),说明密钥可能有问题

  • 增加windows下tortoisegit新用户zgkxp

这一步不是必须的,看自己是否需要在Windows下面操作git仓库,如果不需要就跳过。

生成密钥对

ssh-keygen -t rsa

服务器下zgk用户家目录

git clone git@127.0.0.1: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 git@x.x.x.x: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 git@127.0.0.1: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有指定其他的就把其加到对应的文件就行)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • 本文为 Git教程的学习笔记,教程源自廖雪峰的博客。这是一个由浅入深,学完后能立刻上手的Git教程。另,附上另一本...
    七弦桐语阅读 6,247评论 5 47
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,661评论 9 163
  • 谁会选择像四季缓缓流转 忍受岁月漫长 享受清风许的和善 感动是赋予本身自然 绿山里依然瞧望远方 出走是谁不回头独给...
    醉心语阅读 265评论 0 0
  • 因为喜欢,所以坚持,哪怕是不被别人人理解,也不会哭泣。 因为喜欢,所以去写,哪怕是被别人嘲笑,也不会气馁。 因为喜...
    雨墨忧伤阅读 237评论 0 0