如果不是要與他人協同開發,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...