4.8 服務器上的 Git - Gitolite

Gitolite

本節作爲Gitolite的一個快速指南,指導基本的安裝和設置。不能完全替代隨Gitolite自帶的大量文檔。而且可能會隨時改變本節內容,因此你也許想看看最新的版本

Gitolite是在Git之上的一個授權層,依託sshd或者httpd來進行認證。(概括:認證是確定用戶是誰,授權是決定該用戶是否被允許做他想做的事情)。

Gitolite允許你定義訪問許可而不只作用於倉庫,而同樣於倉庫中的每個branch和tag name。你可以定義確切的人(或一組人)只能push特定的"refs"(或者branches或者tags)而不是其他人。

安裝

安裝Gitolite非常簡單, 你甚至不用讀自帶的那一大堆文檔。你需要一個unix服務器上的賬戶;許多linux變種和solaris 10都已經試過了。你不需要root訪問,假設git,perl,和一個openssh兼容的ssh服務器已經裝好了。在下面的例子裏,我們會用git賬戶在gitserver進行。

Gitolite是不同於“服務”的軟件 -- 其通過ssh訪問, 而且每個在服務器上的userid都是一個潛在的“gitolite主機”。我們在這裏描述最簡單的安裝方法,對於其他方法,請參考其文檔。

開始,在你的服務器上創建一個名爲git的用戶,然後以這個用戶登錄。從你的工作站拷貝你的SSH公鑰(也就是你用ssh-keygen默認生成的~/.ssh/id_dsa.pub文件),重命名爲<yourname>.pub(我們這裏使用scott.pub作爲例子)。然後執行下面的命令:

$ git clone git://github.com/sitaramc/gitolite
$ gitolite/install -ln
    # assumes $HOME/bin exists and is in your $PATH
$ gitolite setup -pk $HOME/scott.pub

最後一個命令在服務器上創建了一個名爲gitolite-admin的Git倉庫。

最後,回到你的工作站,執行git clone git@gitserver:gitolite-admin。然後你就完成了!Gitolite現在已經安裝在了服務器上,在你的工作站上,你也有一個名爲gitolite-admin的新倉庫。你可用通過更改這個倉庫以及推送到服務器上來管理你的Gitolite配置。

定製安裝

默認快速安裝對大多數人都管用,還有一些定製安裝方法如果你用的上的話。一些設置可以通過編輯rc文件來簡單地改變,但是如果這個不夠,有關於定製Gitolite的文檔供參考。

配置文件和訪問規則

安裝結束後,你切換到gitolite-admin倉庫(放在你的HOME目錄)然後看看都有啥:

$ cd ~/gitolite-admin/
$ ls
conf/  keydir/
$ find conf keydir -type f
conf/gitolite.conf
keydir/scott.pub
$ cat conf/gitolite.conf

repo gitolite-admin
    RW+                 = scott

repo testing
    RW+                 = @all

注意 "scott" ( 之前用gl-setup 命令時候的 pubkey 名稱) 有讀寫權限而且在 gitolite-admin 倉庫裏有一個同名的公鑰文件。

添加用戶很簡單。爲了添加一個名爲alice的用戶,獲取她的公鑰,命名爲alice.pub,然後放到在你工作站上的gitolite-admin克隆的keydir目錄。添加,提交,然後推送更改。這樣用戶就被添加了。

gitolite配置文件的語法在conf/example.conf裏,我們只會提到一些主要的。

你可以給用戶或者倉庫分組。分組名就像一些宏;定義的時候,無所謂他們是工程還是用戶;區別在於你使用“宏”的時候

@oss_repos      = linux perl rakudo git gitolite
@secret_repos   = fenestra pear

@admins         = scott
@interns        = ashok
@engineers      = sitaram dilbert wally alice
@staff          = @admins @engineers @interns

你可以控制許可在”ref“級別。在下面的例子裏,實習生可以push ”int“分支。工程師可以push任何有"eng-"開頭的branch,還有refs/tags下面用"rc"開頭的後面跟數字的。而且管理員可以隨便更改(包括rewind)對任何參考名。

repo @oss_repos
    RW  int$                = @interns
    RW  eng-                = @engineers
    RW  refs/tags/rc[0-9]   = @engineers
    RW+                     = @admins

RWorRW+之後的表達式是正則表達式(regex)對應着後面的push用的參考名字(ref)。所以我們叫它”參考正則“(refex)!當然,一個refex可以比這裏表現的更強大,所以如果你對perl的正則表達式不熟的話就不要改過頭。

同樣,你可能猜到了,Gitolite字頭refs/heads/是一個便捷句法如果參考正則沒有用refs/開頭。

一個這個配置文件語法的重要功能是,所有的倉庫的規則不需要在同一個位置。你能報所有普通的東西放在一起,就像上面的對所有oss_repos的規則那樣,然後建一個特殊的規則對後面的特殊案例,就像:

repo gitolite
    RW+                     = sitaram

那條規則剛剛加入規則集的 gitolite 倉庫.

這次你可能會想要知道訪問控制規則是如何應用的,我們簡要介紹一下。

在gitolite裏有兩級訪問控制。第一是在倉庫級別;如果你已經讀或者寫訪問過了任何在倉庫裏的參考,那麼你已經讀或者寫訪問倉庫了。

第二級,應用只能寫訪問,通過在倉庫裏的branch或者tag。用戶名如果嘗試過訪問 (W+),參考名被更新爲已知。訪問規則檢查是否出現在配置文件裏,爲這個聯合尋找匹配 (但是記得參考名是正則匹配的,不是字符串匹配的)。如果匹配被找到了,push就成功了。不匹配的訪問會被拒絕。

帶'拒絕'的高級訪問控制

目前,我們只看過了許可是R,RW, 或者RW+這樣子的。但是gitolite還允許另外一種許可:-,代表 ”拒絕“。這個給了你更多的能力,當然也有一點複雜,因爲不匹配並不是唯一的拒絕訪問的方法,因此規則的順序變得無關了!

這麼說好了,在前面的情況中,我們想要工程師可以rewind任意branch除了master和integ。 這裏是如何做到的

    RW  master integ    = @engineers
    -   master integ    = @engineers
    RW+                 = @engineers

你再一次簡單跟隨規則從上至下知道你找到一個匹配你的訪問模式的,或者拒絕。非rewind push到master或者integ 被第一條規則允許。一個rewind push到那些refs不匹配第一條規則,掉到第二條,因此被拒絕。任何push(rewind或非rewind)到參考或者其他master或者integ不會被前兩條規則匹配,即被第三條規則允許。

通過改變文件限制 push

此外限制用戶push改變到哪條branch的,你也可以限制哪個文件他們可以碰的到。比如, 可能Makefile (或者其他哪些程序) 真的不能被任何人做任何改動,因爲好多東西都靠着它呢,或者如果某些改變剛好不對就會崩潰。你可以告訴 gitolite:

repo foo
    RW                      =   @junior_devs @senior_devs

    -   VREF/NAME/Makefile  =   @junior_devs

這是一個強力的公能寫在 conf/example.conf裏。

個人分支

Gitolite也支持一個叫”個人分支“的功能 (或者叫, ”個人分支命名空間“) 在合作環境裏非常有用。

在 git世界裏許多代碼交換通過”pull“請求發生。然而在合作環境裏,委任制的訪問是‘絕不’,一個開發者工作站不能認證,你必須push到中心服務器並且叫其他人從那裏pull。

這個通常會引起一些branch名稱簇變成像 VCS裏一樣集中化,加上設置許可變成管理員的苦差事。

Gitolite讓你定義一個”個人的“或者”亂七八糟的”命名空間字首給每個開發人員(比如,refs/personal/<devname>/*);看在doc/3-faq-tips-etc.mkd裏的"personal branches"一段獲取細節。

"通配符" 倉庫

Gitolite 允許你定義帶通配符的倉庫(其實還是perl正則式), 比如隨便整個例子的話assignments/s[0-9][0-9]/a[0-9][0-9]。 這是一個非常有用的功能,需要通過設置$GL_WILDREPOS = 1; 在 rc文件中啓用。允許你安排一個新許可模式("C")允許用戶創建倉庫基於通配符,自動分配擁有權對特定用戶 - 創建者,允許他交出 R和 RW許可給其他合作用戶等等。這個功能在doc/4-wildcard-repositories.mkd文檔裏

其他功能

我們用一些其他功能的例子結束這段討論,這些以及其他功能都在 "faqs, tips, etc" 和其他文檔裏。

記錄: Gitolite 記錄所有成功的訪問。如果你太放鬆給了別人 rewind許可 (RW+) 和其他孩子弄沒了 "master", 記錄文件會救你的命,如果其他簡單快速的找到SHA都不管用。

訪問權報告: 另一個方便的功能是你嘗試用ssh連接到服務器的時候發生了什麼。Gitolite告訴你哪個 repos你訪問過,那個訪問可能是什麼。這裏是例子:

    hello scott, this is git@git running gitolite3 v3.01-18-g9609868 on git 1.7.4.4

         R     anu-wsd
         R     entrans
         R  W  git-notes
         R  W  gitolite
         R  W  gitolite-admin
         R     indic_web_input
         R     shreelipi_converter

委託:真正的大安裝,你可以把責任委託給一組倉庫給不同的人然後讓他們獨立管理那些部分。這個減少了主管理者的負擔,讓他瓶頸更小。這個功能在他自己的文檔目錄裏的 doc/下面。

鏡像: Gitolite可以幫助你維護多個鏡像,如果主服務器掛掉的話在他們之間很容易切換。


本文來自 http://git-scm.com/ 保存下來,方便自己查閱。



發佈了3 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章