本節作為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可以幫助你維護多個鏡像,如果主服務器掛掉的話在他們之間很容易切換。
- 1. 起步
- 1.1 關于版本控制
- 1.2 Git 簡史
- 1.3 Git 基礎
- 1.4 安裝 Git
- 1.5 初次運行 Git 前的配置
- 1.6 獲取幫助
- 1.7 小結
- 2. Git基礎
- 2.1 取得項目的 Git 倉庫
- 2.2 記錄每次更新到倉庫
- 2.3 查看提交歷史
- 2.4 撤消操作
- 2.5 遠程倉庫的使用
- 2.6 打標簽
- 2.7 技巧和竅門
- 2.8 小結
- 3. Git分支
- 3.1 何謂分支
- 3.2 分支的新建與合并
- 3.3 分支的管理
- 3.4 利用分支進行開發的工作流程
- 3.5 遠程分支
- 3.6 分支的衍合
- 3.7 小結
- 4. 服務器上的Git
- 4.1 協議
- 4.2 在服務器上部署 Git
- 4.3 生成 SSH 公鑰
- 4.4 架設服務器
- 4.5 公共訪問
- 4.6 GitWeb
- 4.7 Gitosis
- 4.8 Gitolite
- 4.9 Git 守護進程
- 4.10 Git 托管服務
- 4.11 小結
- 5. 分布式Git
- 5.1 分布式工作流程
- 5.2 為項目作貢獻
- 5.3 項目的管理
- 5.4 小結
- 6. Git工具
- 6.1 修訂版本(Revision)選擇
- 6.2 交互式暫存
- 6.3 儲藏(Stashing)
- 6.4 重寫歷史
- 6.5 使用 Git 調試
- 6.6 子模塊
- 6.7 子樹合并
- 6.8 總結
- 7. 自定義Git
- 7.1 配置 Git
- 7.2 Git屬性
- 7.3 Git掛鉤
- 7.4 Git 強制策略實例
- 7.5 總結
- 8. Git與其他系統
- 8.1 Git 與 Subversion
- 8.2 遷移到 Git
- 8.3 總結
- 9. Git 內部原理
- 9.2 Git 對象
- 9.3 Git References
- 9.4 Packfiles
- 9.5 The Refspec
- 9.6 傳輸協議
- 9.7 維護及數據恢復
- 9.8 總結
- 9.1 底層命令 (Plumbing) 和高層命令 (Porcelain)