Gitolite簡介
先說幾個重要的點
- Gitolite是對Git使用的一個封裝
- Giolite服務(wù)器其實是使用perl腳本對通過Git命令進行權(quán)限檢查
- Gitolite服務(wù)器的管理是通過一個名字叫做gitolite-admin的Git倉庫進行管理的
gitolite 的原理很簡單。首先触幼,它提供了一個 gitolite-shell硼瓣。當(dāng)你使用 ssh 訪問 gitolite 時 ssh 服務(wù)會啟動 gitolite-shell。這個腳本會檢查當(dāng)前用戶是否有權(quán)限訪問對應(yīng)的倉庫置谦。如果用戶通過 git push 修改了倉庫內(nèi)容堂鲤,則會觸發(fā) gitolite 預(yù)先配置 git hook,這些 hook 會執(zhí)行創(chuàng)建倉庫媒峡、添加用戶之類的操作瘟栖。
gitolite的本質(zhì)是幾個 prel 腳本加一些純文本配置文件。
Gitolite的安裝
先講明Gitolite服務(wù)器管理的邏輯流程谅阿,這樣在安裝的時候更容易理解半哟。
- 首先Gitolite安裝時,最好指定一個特定用戶签餐,由該用戶安裝Gitolite寓涨,這樣易于管理。我們指定的用戶為
git
- 安裝完成后氯檐,還需要指定一個用戶作為gitolite服務(wù)器管理員戒良,一般這個管理員不是上面說的
git
用戶,而是日常工作中有權(quán)限管理項目代碼權(quán)限的那個人,我們下面指定的管理員為bianjb
冠摄。需要說明糯崎,雖然用戶不同,但是并不要求git用戶和bianjb用戶是否在同一臺物理機器上河泳,視自己情況而定即可 - 在安裝gitolite時我們要指定
bianjb
為管理員沃呢,是依據(jù)bianjb用戶的ssh-key來指定的。
講明了上面三點拆挥,下面開始安裝Gitolite薄霜。
這里使用的是ubuntu14.04平臺,其它ubuntu版本也是類似的纸兔。
前面說了惰瓜,我們需要使用ssh協(xié)議訪問gitolite服務(wù)器,gitolite服務(wù)器是本質(zhì)上是一個git倉庫食拜,所以首先需要安裝基本包git
和ssh-server
,再安裝gitolite
。
下面的所有操作都在用戶主目錄下進行副编。
1.安裝git和ssh-server
在要安裝gitolite的機器上安裝
sudo apt-get install git openssh-server openssh-client
2.生成管理員公鑰
注意:使用將要設(shè)置為管理員的用戶登錄
首先將gitolite管理用戶的ssh-key準(zhǔn)備好负甸,在bianjb用戶下執(zhí)行如下命令:ssh-keygen -t rsa
,之后連續(xù)按三次回車鍵,如下:
bianjb@ubuntu:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/bianjb/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/bianjb/.ssh/id_rsa.
Your public key has been saved in /home/bianjb/.ssh/id_rsa.pub.
The key fingerprint is:
fc:b4:c8:d8:68:f5:38:e4:08:50:cb:9b:36:2a:51:6f bianjb@ubuntu
The key's randomart image is:
+--[ RSA 2048]----+
| . |
| o . |
| o o |
| . o o . |
|. E S . |
| . + o X * . |
|. . = B + |
| . . . |
| |
+-----------------+
這時就在/home/bianjb/.ssh/目錄下生成的公鑰和私鑰呻待,下面的安裝需要用到公鑰id_rsa.pub打月,先把它準(zhǔn)備好。
3.創(chuàng)建用戶git
同樣在將要安裝gitolite服務(wù)器的機器上添加用戶git,并設(shè)置密碼
$ adduser git
$ passwd git
3. 接下來下載gitolite源碼
切換到git用戶蚕捉,并下載源碼
$su git
$git clone https://github.com/sitaramc/gitolite
如下載成功奏篙,這時在git主目錄下多一個gitolite文件夾。
4.安裝gitolite
在git用戶上進行安裝迫淹,安裝目錄為$HOME/bin秘通,所以先創(chuàng)建安裝目錄再安裝。
$mkdir -p $HOME/bin
$ gitolite/install -to ${HOME}/bin
注意:安裝路徑要求為絕對路徑敛熬,而不是相對路徑
這時在$HOME/bin目錄下就會多了一引起腳本文件和配置文件肺稀,這些就是gitlote服務(wù)器的程序。
5.設(shè)置gitolite管理員
在git用戶下進行
將第一步中生成的管理員的id_rsa.pub拿過來应民,放在git主目錄下话原,執(zhí)行如下命令:
$bin/gitolite setup -pk id_rsa.pub
Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/
Initialized empty Git repository in /home/git/repositories/testing.git/
WARNING: /home/git/.ssh/authorized_keys missing; creating a new one
(this is normal on a brand new install)
如果輸出相同的信息,那么說明設(shè)置成功了诲锹。從打印信息中可以看到繁仁,此時已經(jīng)生成了服務(wù)器管理倉庫gitolite-admin.git,這時你在git主目錄下也可以看到一個repositories文件夾归园,里面有g(shù)itolite-admin.git文件夾黄虱,就是這個倉庫。
6.gitolite管理員下載管理倉庫
在gitolite管理員用戶下執(zhí)行g(shù)it clone,也只有在管理員用戶下可以clone,其它用戶是沒有權(quán)限的蔓倍。
$git clone git@192.168.111.129:gitolite-admin.git
下載成功后悬钳,就可以看見gitolite-admin文件夾了,里面有conf和keydir兩個目錄偶翅,其中conf是配置倉庫及其權(quán)限的默勾,keydir是用來存放各個用戶的ssh-key。
Gitolite服務(wù)器管理
服務(wù)器管理員如何進行代碼的配置和權(quán)限管理呢聚谁?通過配置兩個文件夾conf和keydir母剥。
添加,刪除形导,重命名一個倉庫示例
編輯gitolite-admin/conf目錄下gitolite.conf 文件
- 比如添加一個bar倉庫(conf語法可以參考上一節(jié)的介紹)
repo bar
RW+= alice
git add .
git commit -m “add user zgkxp”
git push
添加完畢
要移除一個代碼倉庫环疼,類似要編輯gitolite.conf 文件,刪除對應(yīng)的行并提交朵耕。但服務(wù)器的代碼倉庫并不會自動移除需要自己手動去移除炫隶。
重命名一個倉庫按下面順序(注意順序)
(1)到服務(wù)器上把對應(yīng)的倉庫名字改掉,注意要保留“.git”后綴
(2)改變gitolite.conf中倉庫的名字阎曹,并提交到服務(wù)器
keydir文件夾
其中keydir文件夾比較簡伪阶,就是存放所有的用戶公鑰煞檩,不在該文件夾下面的公鑰,其用戶一律沒有任何訪問權(quán)限栅贴。
放在該文件夾下面的公鑰應(yīng)該以用戶名區(qū)分斟湃,不可重復(fù),后綴名為.pub檐薯。
看一下默認的內(nèi)容:
bianjb@ubuntu:~/gitolite-admin/conf$ ls ../keydir/
bianjb.pub
只有一個管理員的公鑰文件凝赛。
conf文件夾
下面詳細說一下conf文件夾下面的gitolite.conf文件的使用,該文件控制了新建git倉庫及其訪問權(quán)限坛缕。
先看一下墓猎,默認的gitolite.conf文件內(nèi)容:
repo gitolite-admin #管理員倉庫
RW+ = bianjb #只有我設(shè)置的bianjb倉庫有讀寫權(quán)限
repo testing #這是默認的測試用倉庫,名字叫testing
RW+ = @all #keydir下任何人都有讀寫權(quán)限
詳細的語法規(guī)則
1 基本語法
(1)注釋祷膳,以“#”作為注釋的開發(fā)
(2)沒有續(xù)行符“\”
(3)所有的東西都是用空格作為分隔符(不用逗號陶衅,分號等)
(4)用戶名和代碼庫名可以包含'.' '_' '-'等,代碼庫可以包含"/"直晨,用戶名可以有“@”
(5)組名必須以@開始
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. 訪問規(guī)則
訪問規(guī)則一般由四部分組成:[代碼倉庫名] [用戶名] [操作] [ref]
(1)"repo"行
可以跟一個或者多個代碼倉庫门烂,也可以跟組名,或者用正則表達式也可以兄淫。
(2)規(guī)則行
從"repo"開始到下一個"repo"出現(xiàn)之前的行都屬于規(guī)則行屯远,一般是權(quán)限域 refex = 用戶名或者組名等
repo foo bar #兩個倉庫foo和bar配置相同的規(guī)則行
RW+= alice @teamleads
- master = dilbert @devteam
- refs/tags/v[0-9] = dilbert @devteam
RW+ dev/ = dilbert @devteam
RW= dilbert @devteam
R= @managers
- 權(quán)限域里常用的權(quán)限
- R, 只讀
- RW, 允許 push 一個分支 branch, 或者創(chuàng)建一個 branch/tag
- RW+, 可以快速推送, 倒回或者刪除 branches or tags
- 拒絕訪問
(3)refex
用來匹配代碼倉庫的引用(ref),一般使用正則表達式來表示
如果沒有指定refex捕虽,則是以refs/.*作為默認值慨丐,比如
- 拒絕訪問
RW = alice
如果指定了refex,但不是以refs/作為開始泄私,則認為以refs/heads/開始房揭,比如
RW master = alice# becomes 'refs/heads/master' internally
如果是對tag進行限制,則必須寫全
RW refs/tags/v[0-9] = bob
refex默認開頭是固定的晌端,但是結(jié)尾可以隨意匹配捅暴,換句話說就是有正則表達式的“^”在開頭但是沒有“$”在結(jié)尾,比如只指定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)規(guī)則累積
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
4.規(guī)則檢查
用戶dilbert 對foo代碼倉庫的任何ref(any)的W權(quán)限檢查
gitolite access -s foo dilbert W any
類似的其他檢查
gitolite access -s foo dilbert W xyz
gitolite access -s foo dilbert + refs/heads/xyz