Gitolite

2018-07-10 17:14 更新

Gitolite

This section serves as a quick introduction to Gitolite, and provides basic installation and setup instructions. 不能完全替代隨 gitolite 自帶的大量文檔。 There may also be occasional changes to this section itself, so you may also want to look at the latest version here.

Gitolite is an authorization layer on top of Git, relying on sshd or httpd for authentication. (Recap: authentication is identifying who the user is, authorization is deciding if he is allowed to do what he is attempting to).

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上.

Gitolite 是不同于 "server" 的軟件 -- 通過(guò)ssh訪問(wèn), 而且每個(gè)在服務(wù)器上的userid都是一個(gè)潛在的 "gitolite host". We will describe the simplest install method in this article; for the other methods please see the documentation.

To begin, create a user called git on your server and login to this user. Copy your SSH public key (a file called ~/.ssh/id_rsa.pub if you did a plain ssh-keygen with all the defaults) from your workstation, renaming it to <yourname>.pub (we'll use scott.pub in our examples). Then run these commands:

$ 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

That last command creates new Git repository called gitolite-admin on the server.

Finally, back on your workstation, run git clone git@gitserver:gitolite-admin. And you’re done! Gitolite has now been installed on the server, and you now have a brand new repository called gitolite-adminin your workstation. You administer your Gitolite setup by making changes to this repository and pushing.

定制安裝

默認(rèn)快速安裝對(duì)大多數(shù)人都管用,還有一些定制安裝方法如果你用的上的話。Some changes can be made simply by editing the rc file, but if that is not sufficient, there’s documentation on customising Gitolite.

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

安裝結(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è)同名的公鑰文件。

Adding users is easy. To add a user called "alice", obtain her public key, name it alice.pub, and put it in the keydir directory of the clone of the gitolite-admin repo you just made on your workstation. Add, commit, and push the change, and the user has been added.

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" branch. 工程師可以 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

在 RW or RW+之后的表達(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ò)了許可是 RRW, 或者 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ī)則允許。

通過(guò)改變文件限制 push

此外限制用戶 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里。

個(gè)人分支

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é)。

"通配符" 倉(cāng)庫(kù)

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ù)器掛掉的話在他們之間很容易切換。


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)