首先,要使用跟管理 gitolite 一定得先會使用 git。下面就不贅述。
初次設定
對使用者而言,只要設定好 ssh host alias 即可。如果是 gitolite 管理者,還必須將 gitolite-admin 給 clone 下來,才能繼續後面設定的動作。
-
設定 ssh host alias
$ vim ~/.ssh/config host gitolite user git hostname localhost port 22 identityfile ~/.ssh/admin
這個設定的重點是指定連線時使用特定的 identity file (private key),如此才能被 gitolite 認可為管理者 (gitolite 是看你用什麼 key 來決定你的身分)。記得
hostname
的部分要以自己的狀況更換成正確的主機位址。 -
取得管理 gitolite 的 repository
$ git clone gitolite:gitolite-admin
這個 repository 紀錄了所有 gitolite 的權限資料,包含所有 user 的 public key 與 repository 的存取權限設定。
conf/gitolite.conf
中記載了所有專案的名稱以及每個 user 對專案的權限。而keydir
中即為所有 user 的 keys。對 gitolite 的管理與設定都必須透過這個 repo 進行。
管理與設定 (參考資料)
新增使用者
只要將新使用者的 public key 放入 keydir
中並 add, commit, push 至 gitolite server 即可,檔名即為使用者的帳號。 假設現在使用者 someone 提供給我們 public key,我們要將他加入 gitolite 的使用者中:
$ cp /PATH/TO/someone.pub keypair/someone.pub
$ git add keypair/someone.pub
$ git commit -m "Add user someone"
$ git push origin master
完成以上步驟後,someone 就可以利用他的 private key 來存取 server 上的 repos。如果他嘗試直接使用 ssh 登入時,畫面會列出他有權限存取的 repo,以及相對應的權限等級,並立刻結束連線。(這是 gitolite-shell
提供的功能) 下面是舉例:
$ ssh gitolite # 這是我在 ~/.ssh/config 中設定的 host 名稱
PTY allocation request failed on channel 0
hello admin, this is git@CrBoy-VM running gitolite3 v3.01-14-gbc3eb34 on git 1.7.9.5
R W gitolite-admin
R W testing
Connection to localhost closed.
可以看到那個 admin 就是我們在 gitolite 中的虛擬帳號。再次提醒,gitolite 是根據你使用的 key 決定你的身分,如果你用了別把 key 那就會被認為是別的身分。萬一你用的 key 是不能通過的,那 ssh 會提示輸入密碼。為了安全性考量,可以禁止 git 帳號透過密碼登入。
新增專案 repository
修改 conf/gitolite.conf
即可新增或移除專案,並可以設定群組,方便管理。
repo gitolite-admin
RW+ = admin
repo testing
RW+ = @all
gitolite 預設了兩個 repo,一個就是我們正在使用的 gitolite-admin
,另一個是 testing
。repo 底下的則是該 repo 的權限設定。以此範例而言,gitolite-admin
僅有 admin 有權限存取,而 testing
則是所有人都可以存取。(由於 @
開頭的表示群組,@all
應該是 gitolite 預設的群組)
值得注意的是,即使是 gitolite 的管理者,如果他沒有被加入 repo 的話,也是沒有權限存取的。同時也因為設定檔是經由 git 管理,管理者如果想要偷看別人的 repo,也很難完全隱匿 (有 log)。另外,如果管理者把自己的權限給拿掉的話,那就…..(但是還是可以登入主機去修理的,作法很簡單)
指定群組
可以透過 @ 來指定群組,群組中也可以包含群組,如下
@project1 = alice bob
@project2 = crboy dean
@company = boss @project1 @project2
repo 也可以組成群組
@system = proj1 proj2 proj3
repo @system
RW+ = boss
repo 名稱
repo 的名稱可能是一個明確的名稱:
repo some_project
也可能用正規表示法 (regular expression) 表示:
repo team/.+$
結尾加上 $ 符號是為了確保系統將這個名稱認定為正規表示式,避免誤判。 關於 repo 名稱比較複雜,進階設定方式可參考這裡。
權限控制
權限控制的語法為 (我用了類似正規表示法的寫法)
<權限> [<引用>]* = [<user>]+
可用的權限有:C, R, RW, RW+, RWC, RW+C, RWD, RW+D, RWCD, RW+CD (這是從 gitolite 給的 vim syntax 裡面挖出來的),還有一個 -,說明如下
- R 讀取
- W 寫入或建立新的 refs (branches, tags)
-
- 刪除或改變 refs (允許
push -f
)
- 刪除或改變 refs (允許
-
- 拒絕存取 (可用以明確拒絕使用者存取此 repo,須寫在 R 權限之前)
C 和 D 是比較特別的權限
- C (獨立) 僅用於使用正規表示法的 repo,表示可建立符合該正規表示法的 repo 名稱
- C (組合) 僅用於使用正規表示法的 refs,表示可建立符合該正規表示法的 refs 名稱
- D 僅用於使用正規表示法的 refs,表示可刪除符合該正規表示法的 refs 名稱
完整範例
@team = alice bob ### user 群組
@system = proj1 proj2 proj3 ### repo 群組
repo @all ### 所有 repo
R = boss ### 老闆都可以看
repo @system ### 前面定義過的 repos
RW+ = crboy ### CrBoy 都可以讀寫
repo project ### 單一 repo
RW+ master = crboy @team ### 這些人可以讀寫與強制修改 master branch
RWCD dev/ = @team ### team 的人可以在 dev/ 開頭的 branch 底下任意操作
RW+ release = crboy ### 只有 CrBoy 可以更改 release branch
repo crboy/.+$ ### crboy 目錄下的任意 repo
C = crboy ### CrBoy 可以隨意創建
RW+ = crboy ### 當然也可以隨意讀寫 (這行似乎不必要,因為創建的人就可以讀寫)
Last modified on 2012-06-21