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 gitolite@192.168.1.18:git1.pub
- 在服務器端下載
gitlite
git clone https://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 gitolite@192.168.1.18: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 gitolite@192.168.1.22: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 gitolite@192.168.1.22: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 gitolite@192.168.1.18:gitolite-admin
Cloning into 'gitolite-admin'...
gitolite@192.168.1.18'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指的是實用經典案例的意思,是對一些普遍性問題的解決方案的總結和整理。
