使用Gitolite搭建Git伺服器
Git服務的管理工具,主要有如下幾種。
-
Gitosis– 輕量級, 開源項目,使用SSH公鑰認證,只能做到庫級的許可權控制。目前項目已經停止開發,不再維護。
-
Gitolite – 輕量級,開源項目,使用SSH公鑰認證,能做到分支級的許可權控制。
-
Git + Repo + Gerrit – 超級重量級,集版本控制,庫管理和程式碼審核為一身。可管理大型及超大型項目。Android平台使用的就是這種方案。
-
GitLab
-是GitHub的開源版本,使用和配置比較複雜,適合大型團隊、資源密集型開發的管理工具
Gitolite
使用perl語言編寫,維護和更新比較積極,下面測試使用Gitolite搭建Git伺服器。
Gitolite的安裝
- 新建用戶Git伺服器用戶
gitolite
(用於存放管理Git公鑰和倉庫)
adduser gitolite
- 使用
gitolite
用戶登陸伺服器
$ su - gitolite
密碼:
- 確保家目錄
~/.ssh/authorized_keys
是空的或者不存在
一般新建用戶~/.ssh/
目錄是不存在的。
- 客戶端生成ssh密鑰,並將公鑰上傳到伺服器的
Gitolite
用戶家目錄下
$ ssh-keygen -t rsa
生成路徑會在ssh-kengen執行後給出,也可修改。windows下生成路徑默認位於C:/user/用戶名/.ssh
下。
- 上傳客戶端的公鑰到
gitolite
用戶家目錄下
$ pscp C:/Users/win7hostsver/.ssh/id_rsa.pub [email protected]:git1.pub
- 在伺服器端下載
gitlite
git clone //github.com/sitaramc/gitolite
- 創建
bin
目錄,並將gitolite
安裝到bin目錄下
mkdir -p $HOME/bin
gitolite/install -to $HOME/bin
- 將上傳的公鑰
git1.pub
設置為gitolite
的超級管理員
$HOME/bin/gitolite setup -pk git1.pub
初始化空的 Git 倉庫於 /home/gitolite/repositories/gitolite-admin.git/
初始化空的 Git 倉庫於 /home/gitolite/repositories/testing.git/
WARNING: /home/gitolite/.ssh/authorized_keys missing; creating a new one
(this is normal on a brand new install)
此時,gitolite
會初始化兩個倉庫,同時創建authorized_keys
文件
也可以將
gitolite
命令路徑加入到系統環境變數,這樣可以在任何路徑使用gitolite
- 客戶端克隆授權管理倉庫
$ git clone [email protected]:gitolite-admin
管理庫中有兩個目錄,conf/
和keydir/
。
-
conf/gitolite.conf
用於Git項目配置,訪問許可權設置。 -
keydir/
用於存儲用戶的SSH public key(公鑰)。
配置Git伺服器的項目
添加新的Git項目倉庫到本地
倉庫的創建通過編輯gitolite-admin/conf/gitolite.conf
即可,然後將配置後的文件上傳伺服器。
gitolite.conf
中添加如下兩行,新建一個repo1的倉庫:
repo repo1
RW+ = @all
gitolite.conf
管理倉庫有三種許可權,RW+、RW、R
許可權可以賦值給
@all
所有有用戶;或添加到\keydir\
目錄中的公鑰對應的某一個用戶(公鑰文件的名字為RW+
值)如
git1.pub
公鑰文件,RW+ = git1
- 添加並提交修改到
gitolite-admin
git add .
git commit -m "added repo1 gave access to all"
[master 613f720] added repo1 gave access to all
1 file changed, 1 insertion(+), 1 deletion(-)
- 推送到遠程伺服器,
gitolite
會在伺服器創建對應的git倉庫
git push
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (8/8), 703 bytes | 175.00 KiB/s, done.
Total 8 (delta 1), reused 0 (delta 0)
remote: 初始化空的 Git 倉庫於 /home/gitolite/repositories/repo1.git/
To 192.168.1.22:gitolite-admin
f68d497..613f720 master -> master
- 伺服器端
repositories/
倉庫庫目錄下會多出一個空倉庫repo1
$ ls -al repositories/
總用量 20
drwx------ 5 gitolite gitolite 4096 5月 7 21:10 .
drwxr-xr-x 10 gitolite gitolite 4096 5月 7 21:10 ..
drwx------ 8 gitolite gitolite 4096 5月 7 21:10 gitolite-admin.git
drwx------ 7 gitolite gitolite 4096 5月 7 21:10 repo1.git
drwx------ 7 gitolite gitolite 4096 5月 7 21:10 testing.git
- 客戶端直接克隆
$ git clone [email protected]:repo1.git
Cloning into 'repo1'...
warning: You appear to have cloned an empty repository.
本地現有倉庫添加到伺服器
若本地已有倉庫repo2,將其添加到伺服器
gitolite.conf
中配置倉庫repo2
repo repo2
RW+ = git1
新用戶要將其公鑰添加到
/keydir
目錄
- 添加、提交和push
git add .
git commit -m "added repo2 gave access to git1"
git push
- 本地配置遠程伺服器
git remote add origin [email protected]:repo2.git
- 推送本地倉庫
git push origin master
許可權規則示例
repo foo
RW+ = alice
- master = bob
- refs/tags/v[0-9] = bob
RW = bob
RW refs/tags/v[0-9] = carol
R = dave
-
alice對foo倉庫有最高許可權,創建、推送、刪除、回退、覆寫等
-
bob對非master開頭的分支和非v+數字開頭的標籤進行創建和推送
-
carol能夠創建以v+數字開頭的標籤。
-
dave可以克隆和
fetch
(拉取)
組groups管理
gitolite可以通過用戶組的方式進行管理
gitolite.conf
類似於變數的形式管理組,並且非常靈活
@admins = macken steven
@engineers = macken steven wally alice
@staff = @admins @engineers
@interns = ashok
repo secret
RW = @staff
repo foss
RW+ = @admins
RW = @interns
- 同時可以使用正則對分支和標籤進行匹配授權
RW int$ = @interns # @interns組只對以「int」結尾的分支有創建和推送許可權
RW eng- = @engineers # @engineers組只對以「eng-」開頭的分支有創建和推送許可權
RW refs/tags/rc[0-9] = @engineers # @engineers組只對以「rc[0-9]「開頭的標籤有創建和推送許可權
RW+ = @admins # @admins組則對倉庫有最高許可權
遇到的報錯
$ git clone [email protected]:gitolite-admin
Cloning into 'gitolite-admin'...
[email protected]'s password:
fatal: 'gitolite-admin' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
如上提示,需要輸入密碼。
需要安裝openssh
,並將gitolite
用戶添加在sshusers
組中,有的伺服器可能是ssh
組。
SSL(Secure Sockets Layer)安全套接字層,主要用來加密數據傳輸
SSH (Secure SHell)安全shell,實現對所有傳輸的數據進行加密。這樣「中間人」攻擊方式就不可能實現了,並且數據經過壓縮,傳輸速度快。
openssh依賴於openssl,openssl是一個安全套接字層密碼庫,包括主要的密碼演算法、常用密鑰和證書封裝管理及SSL協議。
OpenSSH是SSH協議的實現,實現過程中,需要用到密鑰交換演算法,對稱/非對稱加密演算法,Mac演算法,隨機數演算法。會用到OpenSSL的libcrypto庫{openssl還有libssl庫}。
電腦領域的Cookbook指的是實用經典案例的意思,是對一些普遍性問題的解決方案的總結和整理。