我們項目組打算從svn向git遷移,前幾天我搭建了git環境,把代碼從svn轉移過來,然后所有成員都通過server上的git賬號來做pull和push,一切都安置妥當,沒有問題。但是后來其它項目組也打算使用這個git server,那么問題來了,之前那種授權的方式肯定是不夠的,因為只要能連上server,那么他對這個server上所有的repository都有完全的讀寫權限,這顯然是不可接受的。 所以打算使用Gitolite這個組件來做權限控制,搜索了下,找到的文章貌似都是老版本的,所以有了寫這篇文章的想法。 Gitolite其實也是一個git repository,首先在server上安裝好后,在client上把server上的repository clone下來,在本地做一些更改,再push回server,server端的hooks會根據push上來的配置來更新權限。 接下來,介紹下安裝和配置步驟
准備工作
如果你之前是用git賬號來做權限控制的話,記得把/etc/passwd
里git用戶的shell換回/bin/bash
,然后把~git/.ssh/authorized_key
里不再需要的key移除。 用ssh-kengen
生成一對key,比如your-name和your-name.pub(下文均以此為例) 拷貝私鑰到本用戶的.ssh文件夾中
mv your-name ~/.ssh/
拷貝公鑰到git server上
scp you-name.pub git@your.server.name.or.ip.address:~
為了以后方便,這里可以做一個server別名,指定連接所需的用戶名,server的地址、端口以及私鑰
vim ~/.ssh/config
輸入以下內容
host githost user git hostname your.server.name.or.ip.address port 22 identityfile ~/.ssh/your-name
安裝Gitolite
登錄git server
ssh git@your.server.name.or.ip.address
下載最新的Gitolite
git clone git://github.com/sitaramc/gitolite
安裝,這里說明下,安裝方式有3種,區別在與指定生成gitolite
可執行文件的路徑,這里采用Gitolite作者推薦的第二種,也就是把文件生成到$HOME/bin
中,這樣可以在接下來的bash中直接執行gitolite
命令而不用指定路徑(如果你的~/bin
目錄不存在記得先mkdir ~/bin
)
gitolite/install -ln
設置,由於是第一次運行這個命令,所以這里指定的key是擁有Gitolite管理員權限的
gitolite setup -pk your-name.pub
此命令會在你的~/repositories/
目錄生成兩個repository:gitolite-admin.git和testing.git
配置權限
退到你的workstation上
exit
clone剛才生成的gitolite-admin.git
git clone githost:gitolite-admin
注意這里用的是剛才准備好的server別名來連接的,其中最重要的區別是使用your-name.pub這個key,並且沒有采用絕對路徑來指定想要clone的repository,而是直接使用名稱,並且這個名稱也沒有包括.git這個后綴。這一點很重要,因為這是用Gitolite的機制來clone,如果你跳過它直接使用git來,那么它的一些功能就無法實現了。以后clone, push其它需要受Gitolite權限控制的repository都必須這樣做。 clone完后會有個新的目錄gitolite-admin
,里面有兩個文件夾conf
和keydir
,第一個目錄中包含的是配置文件,里面就是記錄權限配置的地方,第二個目錄中則包含所有用戶的pub key。 現在我們打開配置文件,按照我們的權限配置需要進行設置
vim gitolite-admin/conf/gitolite.conf
我期望的配置如下,你也可以根據你的需要做更改
@repos_a @proj1 @proj2 @repos_b @proj3 @proj4 @proj5 @team_a @user1 @user2 @team_b @user3 @user4 repo gitolite-admin RW+ = your-name repo @repos_a RW+ = @team_a R = @all repo @repos_b RW+ = @team_b
這個配置很簡單,首先定義了兩個repository group,再又定義了兩個user group,group的好處就是以后添加repository和user的時候,不需要再單獨配置,只需加入到對應的group中即可。
- 添加全新的repository,在上面提到的gitolite.conf文件中配置好對應的名稱和權限,再push到server即可,server會自動幫你創建一個empty的bare repository。
- 如果你已經有一個repository,想把它加進來的話,那就把它拷貝到git server上的
~/repositories
文件夾里,記得文件夾名要以.git結尾,並且這個repository一定要是bare的,(你可以通過拷貝repository里的.git文件夾,然后運行git config --bool core.bare true
,也可以運行git clone --bare your-repository
來得到bare repository)。這種方式還有一個額外的操作就是在server上運行一次gitolite setup
。 - 移除repository,在配置文件中移除對應的repo,然后push,接着再刪除server上對應的文件夾即可。
- 添加user,把pub key拷貝到
keydir
文件夾里 - 刪除user,一樣,移除
keydir
里對應的pub key
注意,上面說的操作,都必須在clone的gitolite-admin里做更改,然后push,千萬別在server上自己來,那樣是沒用的,因為這些權限配置、repository管理都有一些額外的操作,gitolite-admin會幫你搞定一切。 把你的更改push回server上,試試clone,pull,push,看看權限是否正確。比如
git clone githost:proj3
更多的內容,可以參考官方文檔 本文由Roy最初發表於:http://blog.chengbo.net/2012/04/20/use-gitolite-to-manage-git-repositories.html,你可以在保持文章完整和保留本聲明的情況下轉帖、分發和印刷等。