Gitolite

2018-09-27 15:42 更新

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

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

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

安裝

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

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

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

$ 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

最后一個命令在服務(wù)器上創(chuàng)建了一個名為gitolite-admin的Git倉庫。

最后,回到你的工作站,執(zhí)行git clone git@gitserver:gitolite-admin。然后你就完成了!Gitolite現(xiàn)在已經(jīng)安裝在了服務(wù)器上,在你的工作站上,你也有一個名為gitolite-admin的新倉庫。你可用通過更改這個倉庫以及推送到服務(wù)器上來管理你的Gitolite配置。

定制安裝

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

配置文件和訪問規(guī)則

安裝結(jié)束后,你切換到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 名稱) 有讀寫權(quán)限而且在 gitolite-admin 倉庫里有一個同名的公鑰文件。

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

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

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

@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"開頭的后面跟數(shù)字的。而且管理員可以隨便更改(包括rewind)對任何參考名。

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

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

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

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

repo gitolite
    RW+                     = sitaram

那條規(guī)則剛剛加入規(guī)則集的 gitolite 倉庫.

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

在gitolite里有兩級訪問控制。第一是在倉庫級別;如果你已經(jīng)讀或者寫訪問過了任何在倉庫里的參考,那么你已經(jīng)讀或者寫訪問倉庫了。

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

帶'拒絕'的高級訪問控制
目前,我們只看過了許可是R,RW, 或者RW+這樣子的。但是gitolite還允許另外一種許可:-,代表 ”拒絕“。這個給了你更多的能力,當然也有一點復(fù)雜,因為不匹配并不是唯一的拒絕訪問的方法,因此規(guī)則的順序變得無關(guān)了!

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

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

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

通過改變文件限制 push

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

repo foo
    RW                      =   @junior_devs @senior_devs

    -   VREF/NAME/Makefile  =   @junior_devs

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

個人分支

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

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

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

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

"通配符" 倉庫

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

其他功能

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

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

訪問權(quán)報告: 另一個方便的功能是你嘗試用ssh連接到服務(wù)器的時候發(fā)生了什么。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可以幫助你維護多個鏡像,如果主服務(wù)器掛掉的話在他們之間很容易切換。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號