使用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/

  1. conf/gitolite.conf 用於Git項目配置,訪問許可權設置。

  2. 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指的是實用經典案例的意思,是對一些普遍性問題的解決方案的總結和整理。

參考