基於Gitolite的Git服務架設


如果不是要與他人協同開發,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 root@git.cmmobi.com:/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


服務端配置(git.cmmobi.com上的配置)
服務要求:
1.任意的unix系統
2.shell環境
3.git版本為1.6.6及以上
4.perl版本為5.8.8及以上
5.openssh版本為5.0及以上
安裝:
1.使用root用戶登陸服務器,並創建git用戶,用以管理git服務
useradd git
echo "git" | passwd git --stdin
2.切換到git用戶,並確保~/.ssh/authorized_keys文件為空或者不存在
3.執行安裝操作:
git clone git://github.com/sitaramc/gitolite #下載gitolite軟件
mkdir -p $HOME/bin
gitolite/install -to $HOME/bin #安裝gitolite
export PATH=$PATH:$HOME/bin
echo "PATH=$PATH:$HOME/bin" >> .bashrc
gitolite setup -pk /tmp/admin.pub #將客戶端的root用戶配置為git的管理員
如果在執行gitolite/install -to $HOME/bin時報如下錯誤:
Can't locate Time/HiRes.pm in @INC (@INC contains: /home/git/gitolite/src/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/git/gitolite/src/lib/Gitolite/Common.pm line 74.
BEGIN failed--compilation aborted at /home/git/gitolite/src/lib/Gitolite/Common.pm line 74.
Compilation failed in require at ./install line 15.
BEGIN failed--compilation aborted at ./install line 15.
需要安裝perl-Time_HiRes:
yum install -y perl-Time-HiRes


安裝完成后,我們可以在$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 "breezey@cmmobi.com"
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 )
-:
減號(-)是一條禁用指令,只對寫操作起作用,不會對用戶的讀操作施加影響。

Git 的詳細介紹:請點這里
Git 的下載地址:請點這里

推薦閱讀:

Fedora通過Http Proxy下載Git http://www.linuxidc.com/Linux/2009-12/23170.htm

在Ubuntu Server上安裝Git http://www.linuxidc.com/Linux/2009-06/20421.htm

服務器端Git倉庫的創建(Ubuntu) http://www.linuxidc.com/Linux/2011-02/32542.htm

Linux下Git簡單使用教程(以Android為例) http://www.linuxidc.com/Linux/2010-11/29883.htm

Git權威指南 PDF高清中文版 http://www.linuxidc.com/Linux/2013-10/91053.htm

本篇文章來源於 Linux公社網站(www.linuxidc.com) 原文鏈接:http://www.linuxidc.com/Linux/2014-02/96991.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM