本節(jié)作為Gitolite的一個(gè)快速指南,指導(dǎo)基本的安裝和設(shè)置。不能完全替代隨Gitolite自帶的大量文檔。而且可能會(huì)隨時(shí)改變本節(jié)內(nèi)容,因此你也許想看看最新的版本。
Gitolite是在Git之上的一個(gè)授權(quán)層,依托sshd或者h(yuǎn)ttpd來(lái)進(jìn)行認(rèn)證。(概括:認(rèn)證是確定用戶是誰(shuí),授權(quán)是決定該用戶是否被允許做他想做的事情)。
Gitolite允許你定義訪問(wèn)許可而不只作用于倉(cāng)庫(kù),而同樣于倉(cāng)庫(kù)中的每個(gè)branch和tag name。你可以定義確切的人(或一組人)只能push特定的"refs"(或者branches或者tags)而不是其他人。
安裝Gitolite非常簡(jiǎn)單, 你甚至不用讀自帶的那一大堆文檔。你需要一個(gè)unix服務(wù)器上的賬戶;許多l(xiāng)inux變種和solaris 10都已經(jīng)試過(guò)了。你不需要root訪問(wèn),假設(shè)git,perl,和一個(gè)openssh兼容的ssh服務(wù)器已經(jīng)裝好了。在下面的例子里,我們會(huì)用git賬戶在gitserver進(jìn)行。
Gitolite是不同于“服務(wù)”的軟件 -- 其通過(guò)ssh訪問(wèn), 而且每個(gè)在服務(wù)器上的userid都是一個(gè)潛在的“gitolite主機(jī)”。我們?cè)谶@里描述最簡(jiǎn)單的安裝方法,對(duì)于其他方法,請(qǐng)參考其文檔。
開(kāi)始,在你的服務(wù)器上創(chuàng)建一個(gè)名為git的用戶,然后以這個(gè)用戶登錄。從你的工作站拷貝你的SSH公鑰(也就是你用ssh-keygen默認(rèn)生成的~/.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
最后一個(gè)命令在服務(wù)器上創(chuàng)建了一個(gè)名為gitolite-admin的Git倉(cāng)庫(kù)。
最后,回到你的工作站,執(zhí)行git clone git@gitserver:gitolite-admin。
然后你就完成了!Gitolite現(xiàn)在已經(jīng)安裝在了服務(wù)器上,在你的工作站上,你也有一個(gè)名為gitolite-admin的新倉(cāng)庫(kù)。你可用通過(guò)更改這個(gè)倉(cāng)庫(kù)以及推送到服務(wù)器上來(lái)管理你的Gitolite配置。
默認(rèn)快速安裝對(duì)大多數(shù)人都管用,還有一些定制安裝方法如果你用的上的話。一些設(shè)置可以通過(guò)編輯rc文件來(lái)簡(jiǎn)單地改變,但是如果這個(gè)不夠,有關(guān)于定制Gitolite的文檔供參考。
安裝結(jié)束后,你切換到gitolite-admin倉(cāng)庫(kù)(放在你的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
命令時(shí)候的 pubkey 名稱) 有讀寫(xiě)權(quán)限而且在 gitolite-admin
倉(cāng)庫(kù)里有一個(gè)同名的公鑰文件。
添加用戶很簡(jiǎn)單。為了添加一個(gè)名為alice的用戶,獲取她的公鑰,命名為alice.pub,然后放到在你工作站上的gitolite-admin克隆的keydir目錄。添加,提交,然后推送更改。這樣用戶就被添加了。
gitolite配置文件的語(yǔ)法在conf/example.conf
里,我們只會(huì)提到一些主要的。
你可以給用戶或者倉(cāng)庫(kù)分組。分組名就像一些宏;定義的時(shí)候,無(wú)所謂他們是工程還是用戶;區(qū)別在于你使用“宏”的時(shí)候
@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“級(jí)別。在下面的例子里,實(shí)習(xí)生可以push ”int“分支。工程師可以push任何有"eng-"開(kāi)頭的branch,還有refs/tags下面用"rc"開(kāi)頭的后面跟數(shù)字的。而且管理員可以隨便更改(包括rewind)對(duì)任何參考名。
repo @oss_repos
RW int$ = @interns
RW eng- = @engineers
RW refs/tags/rc[0-9] = @engineers
RW+ = @admins
在RWorRW+之后的表達(dá)式是正則表達(dá)式(regex)對(duì)應(yīng)著后面的push用的參考名字(ref)。所以我們叫它”參考正則“(refex)!當(dāng)然,一個(gè)refex可以比這里表現(xiàn)的更強(qiáng)大,所以如果你對(duì)perl的正則表達(dá)式不熟的話就不要改過(guò)頭。
同樣,你可能猜到了,Gitolite字頭refs/heads/
是一個(gè)便捷句法如果參考正則沒(méi)有用refs/開(kāi)頭。
一個(gè)這個(gè)配置文件語(yǔ)法的重要功能是,所有的倉(cāng)庫(kù)的規(guī)則不需要在同一個(gè)位置。你能報(bào)所有普通的東西放在一起,就像上面的對(duì)所有oss_repos的規(guī)則那樣,然后建一個(gè)特殊的規(guī)則對(duì)后面的特殊案例,就像:
repo gitolite
RW+ = sitaram
那條規(guī)則剛剛加入規(guī)則集的 gitolite 倉(cāng)庫(kù).
這次你可能會(huì)想要知道訪問(wèn)控制規(guī)則是如何應(yīng)用的,我們簡(jiǎn)要介紹一下。
在gitolite里有兩級(jí)訪問(wèn)控制。第一是在倉(cāng)庫(kù)級(jí)別;如果你已經(jīng)讀或者寫(xiě)訪問(wèn)過(guò)了任何在倉(cāng)庫(kù)里的參考,那么你已經(jīng)讀或者寫(xiě)訪問(wèn)倉(cāng)庫(kù)了。
第二級(jí),應(yīng)用只能寫(xiě)訪問(wèn),通過(guò)在倉(cāng)庫(kù)里的branch或者tag。用戶名如果嘗試過(guò)訪問(wèn) (W或+),參考名被更新為已知。訪問(wèn)規(guī)則檢查是否出現(xiàn)在配置文件里,為這個(gè)聯(lián)合尋找匹配 (但是記得參考名是正則匹配的,不是字符串匹配的)。如果匹配被找到了,push就成功了。不匹配的訪問(wèn)會(huì)被拒絕。
帶'拒絕'的高級(jí)訪問(wèn)控制
目前,我們只看過(guò)了許可是R,RW, 或者RW+這樣子的。但是gitolite還允許另外一種許可:-,代表 ”拒絕“。這個(gè)給了你更多的能力,當(dāng)然也有一點(diǎn)復(fù)雜,因?yàn)椴黄ヅ洳⒉皇俏ㄒ坏木芙^訪問(wèn)的方法,因此規(guī)則的順序變得無(wú)關(guān)了!
這么說(shuō)好了,在前面的情況中,我們想要工程師可以rewind任意branch除了master和integ。 這里是如何做到的
RW master integ = @engineers
- master integ = @engineers
RW+ = @engineers
你再一次簡(jiǎn)單跟隨規(guī)則從上至下知道你找到一個(gè)匹配你的訪問(wèn)模式的,或者拒絕。非rewind push到master或者integ 被第一條規(guī)則允許。一個(gè)rewind push到那些refs不匹配第一條規(guī)則,掉到第二條,因此被拒絕。任何push(rewind或非rewind)到參考或者其他master或者integ不會(huì)被前兩條規(guī)則匹配,即被第三條規(guī)則允許。
此外限制用戶push改變到哪條branch的,你也可以限制哪個(gè)文件他們可以碰的到。比如, 可能Makefile (或者其他哪些程序) 真的不能被任何人做任何改動(dòng),因?yàn)楹枚鄸|西都靠著它呢,或者如果某些改變剛好不對(duì)就會(huì)崩潰。你可以告訴 gitolite:
repo foo
RW = @junior_devs @senior_devs
- VREF/NAME/Makefile = @junior_devs
這是一個(gè)強(qiáng)力的公能寫(xiě)在 conf/example.conf里。
Gitolite也支持一個(gè)叫”個(gè)人分支“的功能 (或者叫, ”個(gè)人分支命名空間“) 在合作環(huán)境里非常有用。
在 git世界里許多代碼交換通過(guò)”pull“請(qǐng)求發(fā)生。然而在合作環(huán)境里,委任制的訪問(wèn)是‘絕不’,一個(gè)開(kāi)發(fā)者工作站不能認(rèn)證,你必須push到中心服務(wù)器并且叫其他人從那里pull。
這個(gè)通常會(huì)引起一些branch名稱簇變成像 VCS里一樣集中化,加上設(shè)置許可變成管理員的苦差事。
Gitolite讓你定義一個(gè)”個(gè)人的“或者”亂七八糟的”命名空間字首給每個(gè)開(kāi)發(fā)人員(比如,refs/personal/<devname>/*
);看在doc/3-faq-tips-etc.mkd
里的"personal branches"
一段獲取細(xì)節(jié)。
Gitolite 允許你定義帶通配符的倉(cāng)庫(kù)(其實(shí)還是perl正則式), 比如隨便整個(gè)例子的話assignments/s[0-9][0-9]/a[0-9][0-9]
。 這是一個(gè)非常有用的功能,需要通過(guò)設(shè)置$GL_WILDREPOS = 1;
在 rc文件中啟用。允許你安排一個(gè)新許可模式("C")允許用戶創(chuàng)建倉(cāng)庫(kù)基于通配符,自動(dòng)分配擁有權(quán)對(duì)特定用戶 - 創(chuàng)建者,允許他交出 R和 RW許可給其他合作用戶等等。這個(gè)功能在doc/4-wildcard-repositories.mkd
文檔里
我們用一些其他功能的例子結(jié)束這段討論,這些以及其他功能都在 "faqs, tips, etc" 和其他文檔里。
記錄: Gitolite 記錄所有成功的訪問(wèn)。如果你太放松給了別人 rewind許可 (RW+) 和其他孩子弄沒(méi)了 "master", 記錄文件會(huì)救你的命,如果其他簡(jiǎn)單快速的找到SHA都不管用。
訪問(wèn)權(quán)報(bào)告: 另一個(gè)方便的功能是你嘗試用ssh連接到服務(wù)器的時(shí)候發(fā)生了什么。Gitolite告訴你哪個(gè) repos你訪問(wèn)過(guò),那個(gè)訪問(wèn)可能是什么。這里是例子:
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
委托:真正的大安裝,你可以把責(zé)任委托給一組倉(cāng)庫(kù)給不同的人然后讓他們獨(dú)立管理那些部分。這個(gè)減少了主管理者的負(fù)擔(dān),讓他瓶頸更小。這個(gè)功能在他自己的文檔目錄里的 doc/下面。
鏡像: Gitolite可以幫助你維護(hù)多個(gè)鏡像,如果主服務(wù)器掛掉的話在他們之間很容易切換。
更多建議: