基於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 [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


服務端配置(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 "[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 )
-:
減號(-)是一條禁用指令,只對寫操作起作用,不會對用戶的讀操作施加影響。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章