1. 程式人生 > >使用Gitolite搭建Git伺服器

使用Gitolite搭建Git伺服器

[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