基於Gitolite的Git服務架設

2021-09-08 20:06:28 字數 4422 閱讀 4893

如果不是要與他人協同開發,git根本不需要架設伺服器,git可以直接使用本地版本庫的路徑完成git版本間的操作。但是如果需要和他人分享版本庫,協作開發,就需要能夠通過網路協議操作git庫。git支援的協議很豐富,架設伺服器的選擇也很多,不同的方案有著各自的公優缺點。本文就以gitolite為例構建乙個高效的多人協作的git伺服器。

環境:git客戶端test.cmmobi.com(172.16.5.202),git伺服器為git.cmmobi.com(172.16.5.200)。配置好/etc/hosts檔案,以讓其可互相解析

cat /etc/hosts

172.16.5.202 test.cmmobi.com

172.16.5.200 git.cmmobi.com

客戶端配置(test.cmmobi.com上的配置)

建立使用者,並生成金鑰對,在此為方便測試,就不再另外建立使用者,直接使用root使用者即可。

cd /root

mkdir .ssh

ssh-keygen -f ~/.ssh/admin

將生成的公鑰上傳到git伺服器的/tmp目錄以備用

scp ~/.ssh/admin.pub [email protected]:/tmp

建立訪問git服務時的配置檔案

cat ~/.ssh/config

host gitolite #git伺服器別名

user git #服務端管理gitolite的使用者

hostname git.cmmobi.com #git伺服器的主機名

port 22 #訪問git伺服器時的埠號

identityfile ~/.ssh/admin #訪問git伺服器時使用的公鑰檔案

chmod 600 ~/.ssh/config

安裝完成後,我們可以在$home下看到乙個repositories目錄,裡面有兩個倉庫,分別為gitolite-admin和testing,其中gitolite-admin為管理倉庫。

在客戶端通過root使用者轉殖gitolite-admin庫

git clone gitolite:gitolite-admin

進入gitolite-admin倉庫,會看到兩個目錄,分別為keydir和conf,其中keydir目錄用來管理使用者,在其中可以看到預設有乙個檔案叫做admin.pub,正是我們之前生成的管理使用者的公鑰檔案。下面我們再新增乙個使用者breezey:

useradd breezey

echo "breezey" | passwd breezey --stdin

su - breezey

mkdir .ssh

ssh-keygen -f .ssh/breezey

vim .ssh/config

host gitolite

user git

hostname git.cmmobi.com

port 22

identityfile ~/.ssh/breezey

su - root #切換回管理使用者

cp /home/breezey/.ssh/breezey.pub /root/gitolite-amdin/keydir

cd /root/gitolite-admin

git add keydir

git status

git config --global user.email "[email protected]"

git config --global user.name "breezey"

git commit -a "add user:breezey"

git push

su - breezey #再切換到breezey使用者

git clone gitolite:testing #轉殖testing倉庫,這時已經可以成功轉殖。

我們可以進入到testing庫中,建立乙個測試檔案並提交:

cd testing

echo "hello world" > welcome.txt

git add *

git commit -m "a new file:welcome.txt"

git push

當我們第一次提交並執行git push時,會出現如下錯誤:

no refs in common and none specified; doing nothing.

perhaps you should specify a branch such as 'master'.

fatal: the remote end hung up unexpectedly

error: failed to push some refs to 'gitolite:test1'

出現這個問題的原因,是因為git找不到你要提交的版本,可以使用如下命令:

git push origin master

gitolite授權詳解

前文我們提到,在gitolite-admin的管理倉庫中有兩個目錄,其中keydir目錄為管理使用者的目錄,而另外乙個conf目錄裡,有乙個叫作gitolite.conf的配置檔案,此檔案即是管理倉庫及使用者授權的檔案。

我們先來看乙個該配置檔案的示例:

1 @admin = breezey chenliang

2 repo gitolite-admin

3 rw+ = breezey

4 repo ossxp/.+

5 c = @admin

6 rw = @all

7 repo testing

8 rw+ = @admin

9 rw master = junio

10 rw+ pu = junio

11 rw cogito$ = pasky

12 rw bw/ = linus

13 - = somebody

14 rw tmp/ = @all

15 rw refs/tags/v[0-9] = junio

我們先對該示例檔案作乙個簡單的說明,以方便大家對授權檔案有乙個基本的了解:

第1行定義了乙個admin的組,該組裡包含兩個使用者,分別是breezey chenliang

第2-3行定義了乙個版本庫gitolite-admin,並且指定breezey使用者對gitolite-admin倉庫擁有讀(r),寫(w)和強制更新(+)的許可權

第4行通過正規表示式定義了一組版本庫,即ossxp目錄下的所有版本庫

第5行定義admin組的使用者可以在ossxp目錄下建立版本庫

第6行定義所有使用者對ossxp目錄下的版本庫擁有讀寫的許可權,但不能強制更新

第7行定義了乙個版本庫testing

第8行定義了admin組使用者對testing庫的所有分支和tag擁有讀、寫、重置、新增、刪除的許可權

第9行定義junio使用者對master分支有讀寫的許可權,還包括以master開頭的所有分支。

第10行定義junio使用者對pu分支擁有讀寫,重置,新增,刪除的許可權,還包括以pu開頭的所有分支

第11行定義pasky使用者對cogito分支擁有讀寫的許可權,僅此分支,精確匹配

第12行定義linus使用者對bw/擁有讀寫的許可權

第13行定義somebody使用者對testing倉庫有寫的許可權

第14行定義所有使用者對tmp/擁有讀寫的許可權

第15行定義junio可以讀寫任意tag,包括以v加上數字開頭的tag

組的定義:

@admin = breezey chenliang

@user = @admin @staff user1

版本庫的定義:

repo ossxp/.+ #匹配ossxp目錄下的所有版本庫

repo myrepo.$ #匹配以myrepo.結尾的版本庫

repo sandbox/test1 #建立sandbox下的test1庫

授權關鍵字:

c:c代表建立。僅在符版本庫授權時可以使用。用於指定誰可以建立與萬用字元匹配的版本庫。

r,rw,rw+:

r為唯讀,rw為讀寫,rw+為讀寫及強制push

rwd,rw+d:

只有當授權指令中定義了正則引用(正規表示式定義的branch、tag等),才可以使用該授權指令。其中 d 的含義是允許刪除和正則引用匹配的引用(branch or tag)

rwcd,rw+cd:

只有當授權指令中定義了正則引用(正規表示式定義的branch、tag等),才可以使用該授權指令。其中 c 的含義是允許建立和正則引用匹配的引用(branch or tag),d的含義是允許刪除和正則引用匹配的引用(branch or tag )

-:減號(-)是一條禁用指令,只對寫操作起作用,不會對使用者的讀操作施加影響。

推薦閱讀:

在ubuntu server上安裝git

伺服器端git倉庫的建立(ubuntu)

linux下git簡單使用教程(以android為例)

git權威指南 pdf高畫質中文版

基於Gitolite管理的Git伺服器搭建v1 0

客戶端 在此為方便測試,就不再另外建立使用者,直接使用客戶端root使用者即可生成金鑰對,注意,此處生成的金鑰隊需要和用於ssh鏈結的金鑰對區別開來。cd root ssh keygen f ssh oreki將生成的公鑰 my.pub 上傳到伺服器的以備用 scp ssh oreki.pub dr...

Gitolite 部署GiT 倉庫

gitolite 提供了便於部署git遠端倉庫的工具,它本身並不提供服務,服務仍舊依託 ssh 對外提供。gitolite 增強了授權體系,和倉庫管理功能。在本地clone乙個gitolite admin的倉庫,直接在本地修改,再推送到遠端伺服器上即可生效。gitolite適合小團隊管理.usera...

使用gitolite管理git許可權

1 伺服器上新增專用管理賬戶git,並在伺服器上安裝git 2 建立本地機器的公私鑰 3 伺服器安裝gitolite 4 倉庫新增與管理 5 新增使用者並管理使用者許可權 6 修改管理員的公鑰 7 修復管理員的許可權 一 伺服器上安裝git略過 二 建立本地機器的公私鑰 ssh keygen f s...