使用Gitolite搭建Git伺服器
阿新 • • 發佈:2020-07-26
[toc]
Git服務的管理工具,主要有如下幾種。
- [Gitosis](https://github.com/res0nat0r/gitosis)- 輕量級, 開源專案,使用SSH公鑰認證,只能做到庫級的許可權控制。目前專案已經停止開發,不再維護。
- [Gitolite](https://github.com/sitaramc/gitolite) - 輕量級,開源專案,使用SSH公鑰認證,能做到分支級的許可權控制。
- [Git](http://git-scm.com/) + [Repo](http://source.android.com/source/downloading.html) + [Gerrit](http://code.google.com/p/gerrit/) - 超級重量級,集版本控制,庫管理和程式碼稽核為一身。可管理大型及超大型專案。Android平臺使用的就是這種方案。
- `GitLab`-是GitHub的開源版本,使用和配置比較複雜,適合大型團隊、資源密集型開發的管理工具
`Gitolite`使用perl語言編寫,維護和更新比較積極,下面測試使用Gitolite搭建Git伺服器。
## Gitolite的安裝
- 新建使用者Git伺服器使用者`gitolite`(用於存放管理Git公鑰和倉庫)
```sh
adduser gitolite
```
- 使用`gitolite`使用者登陸伺服器
```sh
$ su - gitolite
密碼:
```
- 確保家目錄`~/.ssh/authorized_keys`是空的或者不存在
一般新建使用者`~/.ssh/`目錄是不存在的。
- 客戶端生成ssh金鑰,並將公鑰上傳到伺服器的`Gitolite`使用者家目錄下
```sh
$ ssh-keygen -t rsa
```
生成路徑會在ssh-kengen執行後給出,也可修改。windows下生成路徑預設位於`C:/user/使用者名稱/.ssh`下。
- 上傳客戶端的公鑰到`gitolite`使用者家目錄下
```sh
$ pscp C:/Users/win7hostsver/.ssh/id_rsa.pub [email protected]:git1.pub
```
- 在伺服器端下載`gitlite`
```sh
git clone https://github.com/sitaramc/gitolite
```
- 建立`bin`目錄,並將`gitolite`安裝到bin目錄下
```sh
mkdir -p $HOME/bin
gitolite/install -to $HOME/bin
```
- 將上傳的公鑰`git1.pub`設定為`gitolite`的超級管理員
```sh
$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`
- 客戶端克隆授權管理倉庫
```sh
$ 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的倉庫:
```sh
repo repo1
RW+ = @all
```
> `gitolite.conf`管理倉庫有三種許可權, `RW+、RW、R`
>
> 許可權可以賦值給`@all`所有有使用者;或新增到`\keydir\`目錄中的公鑰對應的某一個使用者(公鑰檔案的名字為`RW+`值)
>
>如`git1.pub`公鑰檔案,`RW+ = git1`
- 新增並提交修改到`gitolite-admin`
```sh
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倉庫
```sh
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`
```sh
$ 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
```
- 客戶端直接克隆
```sh
$ git clone [email protected]:repo1.git
Cloning into 'repo1'...
warning: You appear to have cloned an empty repository.
```
### 本地現有倉庫新增到伺服器
若本地已有倉庫repo2,將其新增到伺服器
- `gitolite.conf`中配置倉庫repo2
```sh
repo repo2
RW+ = git1
```
> 新使用者要將其公鑰新增到`/keydir`目錄
- 新增、提交和push
```sh
git add .
git commit -m "added repo2 gave access to git1"
git push
```
- 本地配置遠端伺服器
```sh
git remote add origin [email protected]:repo2.git
```
- 推送本地倉庫
```sh
git push origin master
```
## 許可權規則示例
```s
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`類似於變數的形式管理組,並且非常靈活
```sh
@admins = macken steven
@engineers = macken steven wally alice
@staff = @admins @engineers
@interns = ashok
repo secret
RW = @staff
repo foss
RW+ = @admins
RW = @interns
```
- 同時可以使用正則對分支和標籤進行匹配授權
```sh
RW int$ = @interns # @interns組只對以“int”結尾的分支有建立和推送許可權
RW eng- = @engineers # @engineers組只對以“eng-”開頭的分支有建立和推送許可權
RW refs/tags/rc[0-9] = @engineers # @engineers組只對以“rc[0-9]“開頭的標籤有建立和推送許可權
RW+ = @admins # @admins組則對倉庫有最高許可權
```
## 遇到的報錯
```s
$ 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庫}。
- https://www.zhihu.com/question/40175330
- https://segmentfault.com/a/1190000006939068
*計算機領域的Cookbook指的是實用經典案例的意思,是對一些普遍性問題的解決方案的總結和整理。*
## 參考
- [使用Gitolite搭建輕量級的Git伺服器](http://blog.chinaunix.net/uid-15174104-id-384357