Gitolite v3安裝配置指南
gitolite在近期做了很多代碼改動,升級到了v3版本,而我使用的是v3.5.2。在《Git權威指南》中所提及的是v2版本,有很多東西已經不適合當前的v3版本,比如安裝和用戶自有倉儲的配置,一些公用的部分有一些從書中摘抄而來。
1.ssh協議
SSH 協議用於為 Git 提供遠程讀寫操作,是遠程寫操作的標准服務,在智能HTTP協議出現之前,甚至是寫操作的唯一標准服務。
ssh可用於遠程登錄,服務端需要安裝openssh-server,客戶端需要安裝openssh-client。
之所以介紹ssh協議是因為gitolite以及gitosis都是基於ssh公鑰認證的。
$ ssh-keygen
該命令會在用戶目錄下.ssh目錄下生成兩個文件
id_rsa
私鑰文件。是基於 RSA 算法創建。該私鑰文件要妥善保管,不要洩漏。
id_rsa.pub
公鑰文件。和 id_rsa 文件是一對兒,該文件作為公鑰文件,可以公開。
$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@server
將本地公鑰提供給遠程服務器,以達到無需口令直接登錄的效果。實際上是將id_rsa.pub添加到authorized_keys中,直接操作authorized_keys效果一樣。
遠程登錄方法:
ssh user@server
使用主機別名方法登錄:
編輯~/.ssh/config
host server
user admin
port 22
identityfile ~/.ssh/jiangxing #指定登錄時使用的本地公鑰
本地可以生成不同別名的公鑰,方法是:
ssh-keygen -f ~/.ssh/<filename>
2.創建git用戶
$ sudo adduser --system --shell /bin/bash --group git
有的系統,只允許特定的用戶組(如 ssh 用戶組)的用戶才可以通過 SSH 協議登錄,這就需要將新建的 git 用戶添加到 ssh 用戶組中。
$ sudo adduser git ssh
設置密碼
$ passwd git
3.生成ssh key
切換到git用戶:
$ su git
$ ssh-keygen
$ ssh-copy-id
[email protected]
4.下載gitolite
git clone git://github.com/sitaramc/gitolite
5.安裝配置
我是安裝在git用戶根目錄下的。
在根目錄下創建bin文件夾
然後執行:
~/gitolite/install -to ~/bin
mv ~/.ssh/authorized_keys ~/git.pub
~/bin/gitolite setup -pk ~/git.pub
成功後出現:
初始化空的 Git 版本庫於 /home/git/repositories/gitolite-admin.git/
初始化空的 Git 版本庫於 /home/git/repositories/testing.git/
安裝成功。
所謂更新就是重新安裝。
6.測試
還是在git用戶下
ssh
[email protected]
如果返回類似這樣的信息:
hello git, this is git@linux-dev running gitolite3 v3.5.2-4-g62fb317 on git1.8.1.2
R W gitolite-admin
R W testing
代表gitolite工作正常
7.添加用戶
在第5步可以看到,成功安裝後gitolite會自動生成兩個倉儲,一個是testing.git用來測試,另一個gitolite-admin就是用來管理gitolite的配置倉儲。
將gitolite-admin.git clone到本地,注意:還是在git用戶下,因為當前只有git用戶對其有讀寫權限。
$ git clone
[email protected]:gitolite-admin
成功clone到本地後,可以看到這個目錄結構如下:
git@linux-dev:~/gitolite-admin$ tree
.
├── conf
│ └── gitolite.conf
└── keydir
└── git.pub
2 directories, 2 files
conf是放置配置文件的目錄,gitolite.conf就是gitolite的配置文件,包含對用戶、倉儲、倉儲權限的配置。
keydir目錄用來放置所有的用戶公鑰。git.pub為安裝時setup -pk的那個用戶公鑰。
添加用戶,首先就是要把目標用戶的公鑰添加到keydir下,並重命名為該用戶的用戶名.pub。
目標用戶:
$ echo ~/.ssh/id_rsa.pub
ssh - rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVPPqRucnXGPOP2I6NbJ4wgg9vwb91mo9Q3AZJgbaK45Qz5UK71qM9JxL71jU3F2ogk1NHD0MCIlmmI50/1f1BHhd+ xxxxxxxxxxxx+ DU30KzsylQVN3sAz4gOpvz+ zl7ftBPxtVYwSluJ+ om4V4mbXT9+ uczRbCe1ejhYdg7vKYQV7K1VJ26hON8ztCRarL52Irq/6a5It1Q78xv6Xf5F4mQOzUQsQp2EthtoA9XPiIybMjzNThDfbbKeW7kRZxBgi0RWLRYUSmc/ UBNkQuub8l+ II4S0FNhnUlNkmC/ mUHKTqcjeS1fyJAkRcYC+ fVTd4zqBNj1JupZfafpaeB keven@linux- dev
將顯示內容給git用戶,或在git用戶下粘貼來也可。目標用戶名為keven,則最終應該以git用戶身份將其保存在keydir目錄下,命名為keven.pub
然後添加用戶相應權限。
只要是在keydir下存在的用戶,都屬於@all用戶組,其他用戶組可通過在gitolite.conf自行定義。
如:
@admin = git keven
repo gitolite - admin
RW + = @admin
repo testing
RW + = git
RW = @all
@admin用戶組有兩個用戶git keven,分別對應keydir下的git.pub, keven.pub。
gitolite-admin倉儲的讀/寫/強制更新權限 只有@admin用戶組擁有;
testing倉儲的讀/寫/強制更新全系愛你 只有git用戶擁有,其他所有在keydir下存在公鑰的用戶享有讀/寫權限。
8.權限配置
權限配置在gitolite.conf中進行,注釋用#表示。
C
C 代表創建。僅在 通配符版本庫 授權時可以使用。用於指定誰可以創建和通配符匹配的版本庫。
R, RW, 和 RW+
R 為只讀。RW 為讀寫權限。RW+ 含義為除了具有讀寫外,還可以對 rewind 的提交強制 PUSH。
RWC, RW+C
只有當授權指令中定義了正則引用(正則表達式定義的分支、裡程碑等),才可以使用該授權指令。其中 C 的含義是允許創建和正則引用匹配的引用(分支或裡程碑等)。
RWD, RW+D
只有當授權指令中定義了正則引用(正則表達式定義的分支、裡程碑等),才可以使用該授權指令。其中 D 的含義是允許刪除和正則引用匹配的引用(分支或裡程碑等)。
RWCD, RW+CD
只有當授權指令中定義了正則引用(正則表達式定義的分支、裡程碑等),才可以使用該授權指令。其中 C 的含義是允許創建和正則引用匹配的引用(分支或裡程碑等),D 的含義是允許刪除和正則引用匹配的引用(分支或裡程碑等)。
-
是一條禁用指令。只對寫操作起作用,即禁用用戶的寫操作。
接下來實際分析一個稍微復雜一些的配置文件
1 @admin = git keven admin1 admin2
2 @devteam = dev1 dev2 dev3 fish
3
4 repo gitolite-admin
5 RW+ = git keven
6
7 repo Projects/.+
8 C = @admin
9 RW = @all
10
11 repo testing
12 RW+ = @admin
13 - = fish
14 RW master = @dev
15 RW+ dev = dev1
16 RW wip$ = dev2
逐行解釋:
1: @admin用戶組有git keven admin1 admin2四個用戶
2:@devteam用戶組有dev1 dev2 dev3 fish四個用戶
4:對於gitolite-admin倉儲
5:git keven兩個用戶擁有讀/寫/強制更新的權限
7:對於Projects下所有的git倉儲(/.+代表遞歸所有)
8:@admin用戶組擁有創建倉儲的權限
9:所有人均可讀/寫
11:對於testing.git
12:@admin用戶組擁有讀/寫/強制更新的權限
13:fish是新手,對其屏蔽寫的權限。因為其屬@dev組,則還只剩下R 讀的權限
14:@dev用戶組對master開頭的分支擁有讀/寫權限
15:dev1這個用戶對dev開頭的分支擁有讀/寫/強制更新的權限
16:dev2這個用戶對於wip分支(嚴格匹配)具有讀/寫權限
冷門用法,需要用戶對gitolite有一定了解
有的時候用戶可能需要在服務器端創建屬於自己的倉儲,這個時候就需要像下邊這樣:
1 @admin = git keven admin1 admin2
2 repo pub/CREATOR/.+$
3 C = @all
4 RW+ = CREATOR
5 R = @admin
每個用戶都可以在users/<自己的用戶名>目錄下創建屬於自己的倉儲,而這個倉儲,自己擁有完整的權限,管理員只有讀權限。
注:RW+ = CREATOR丟失會導致只能init空倉儲而不能向上推送內容。
用法:
在用戶shell中,進入要提交至服務器的倉儲,執行:
git push git@server:pub/<username>/somegit.git <branch>
用戶可以通過ssh git@server perms對倉儲權限進行設置,允許其他用戶擁有寫權限等。
添加讀權限是READERS,讀寫權限是WRITERS
操作:
ssh git@server perms pub/<username>/somegit READERS user1
ssh git@server perms pub/<username>/somegit WRITERS user2
9.遠程創建/刪除倉儲
創建:
關於創建倉儲,方法有三種:
a. 登錄遠程服務器創建
ssh登錄服務器,切換至git用戶,進入相關目錄,創建某倉儲
mkdir somegit.git
cd somegit.git
git init --bare
創建完畢
b.修改gitolite.conf創建倉儲
打開gitolite-admin/conf/gitolite.conf,添加:
repo testing2
RW+ = @all
保存修改,提交。
git@linux-dev:~/gitolite-admin$ git commit-m'add test2'
[master b26be9a] add test2
1 file changed, 4 insertions(+)
git@linux-dev:~/gitolite-admin$ git push origin master
Counting objects: 7, done.
Delta compression using up to2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4),350 bytes, done.
Total 4 (delta 1), reused0 (delta0)
remote: 初始化空的 Git 版本庫於 /home/git/repositories/testing2.git/
To
[email protected]:gitolite-admin
0c409e4..b26be9a master -> master
可以看到,gitolite會自動檢測配置文件,發現目前沒有的倉儲會自動才創建。
c.高端大氣上檔次
對於通配符版本庫,即repo Projects/.+類型的,在有創建權限的用戶shell中,本地執行:
mkdir somegit
cd somegit
git init
git commit --allow-empty
git remote add origin git@server:Projects/somegit.git
git push origin master
gitolite會直接創建新的倉儲。
刪除:
1.在conf/gitolite.conf中刪除相關倉儲配置信息(gitolite不會自動刪除服務器上的文件,這點與add不同);
2.登錄服務器刪除需要刪除的倉儲。
重命名
同刪除操作的步驟。