如何搭建私有可協作的 Git 伺服器
本文是「上雲連載」系列的第三篇,將介紹如何在騰訊雲 CVM 上搭建一個私有可協作的 Git 伺服器。文中操作也適用於其他雲服務商提供的伺服器資源,具體配置時請注意操作系統的異同。
為什麼?
搭建私有 Git 伺服器,對於個人部署 Web 應用來說並不是必須的,你完全可以跳過這一步驟,使用 Github 管理自己的應用倉庫。
這次回遷過程中選擇自己搭建,一是出於練習的目的,二是發現國內拉取 Github 倉庫速度較慢。這點大家在使用各種國外資源庫時想必都有體會。
另外,如果你是一名移動開發者,而且應用收費的話,使用私有 Git 伺服器可以很好地保護你的代碼。
Gitolite
能夠託管 Git 倉庫的軟體有很多,如 Gitosis、GitList、Gitlab 等,其中不少還有比較好看的圖形界面。但在本文中,我們選擇的是一個圖形界面的項目:Gitolite。
Gitolite 可以幫助你管理對私有 Git 伺服器的訪問許可權,有如下特點:
- 伺服器上只有一個 Unix 用戶
- 允許多個 gitolite 用戶訪問
- 這些 gitolite 用戶不是伺服器上的真實用戶
- 因此沒有 shell 許可權
- 管理各個倉庫的訪問許可權
- 無需 root 即可安裝
- 通過 sshd 進行用戶驗證
安裝 Gitolite
上一篇的最後,我們在安裝 oh-my-zsh 時已經安裝了 Git。接下來只要安裝 Gitolite 即可。
在 Debian 8 系統上,鍵入如下命令:
sudo apt-get install gitolite3
在安裝過程中,它會要求你選擇用來管理 Gitolite 的公鑰地址。我們暫時不做選擇。
接下來,我們將創建一個系統級別用戶,專門用來管理 gitolite。該用戶的名稱可以設置為 git,方便協作者記憶。我們不設置密碼,這樣就只能使用 su 命令來訪問 git 用戶。
sudo adduser --system --shell /usr/bin/zsh --gecos git version control --group --disabled-password --home /home/git git
我喜歡給新用戶也使用 zsh,接著把管理用戶 earlgrey 中的 .zshrc 設置複製到 git 用戶。
sudo cp .zshrc /home/git/.zshrc
配置密鑰對
在本地電腦上生成一個用於管理 Gitolite 的 SSH 密鑰對,你可以繼續使用上一篇中生成的密鑰對,但推薦單獨生成一個。生成密鑰對時,注意更改保存地址和文件名稱,不要覆蓋之前的密鑰對。
假設最終生成的密鑰對名稱為 git_rsa,我們可以這樣將公鑰複製到 Git 伺服器:
scp ~/.ssh/git_rsa.pub earlgrey@qcloud-cvm-ip:/tmp/git-admin.pub
配置 Gitolite
接下來,我們以普通用戶登錄伺服器。再通過 su 命令登錄 git 用戶,使用剛才複製的公鑰來初始化 Gitolite。
sudo su - gitngitolite setup -pk /tmp/git-admin.pubn
管理 Gitolite
下面可以回到本地,開始管理 Gitolite。這主要是通過修改 gitolite-admin 倉庫來實現。
首先,我們從剛配置好的 Git 伺服器上克隆該庫到本地:
git clone git@qcloud-cvm-ip:gitolite-admin
這會在當前目錄下創建一個叫做 gitolite-admin 的目錄。我們可以通過修改該目錄下的文件,對伺服器的訪問策略做出修改。
添加新用戶
為了與同事或其他人員進行寫作,我們需要給項目添加新用戶。為此,就需要他們提供公鑰。Gitolite 會將用戶名與同名的公鑰關聯起來。假設我們要添加一個名為 pythontg 的用戶。
在本地機器上,我們切換到 gitolite-admin 目錄,看看目錄下都有些什麼文件:
cd gitolite-adminnlsn
輸出結果顯示,目錄中共有兩個文件夾:conf 和 keydir。keydir 就是用於保存用戶公鑰的。
我們將從 pythontg 用戶那裡得到的公鑰,複製到該目錄下:
cp /path/to/pythontg/public/key.pub ~/gitolite-admin/keydir/pythontg.pub
然後將新文件添加到 git,並提交更改:
git add keydir/pythontg.pubngit commit -m New user pythontg addedngit pushn
配置許可權
完成上面的操作之後,你可能會看到下面這樣的警告信息:
remote: nremote: ***** WARNING *****nremote: the following users (pubkey files in parens) do not appear in the config file:nremote: pythontg(pythontg.pub)n
該信息表示新用戶沒有在配置文件中出現。這意味著,雖然 Gitolite 已經知道新建了這麼一個用戶,但是還沒有為新用戶創建任何許可權。
編輯 ~/gitolite-admin/conf/gitolite.conf 文件,並為其創建一個新倉庫:
repo gitolite-adminn RW+ = git-adminnnrepo testingn RW+ = @allnnrepo pythontgn RW+ = pythontgn
Gitolite 使用 repo 關鍵詞 + 倉庫名,指定 git 倉庫。並在下方編輯許可權類型,以及擁有許可權的用戶。
@all 是用戶組的名稱,這裡是一個特殊的用戶組,表示所有的 gitolite 用戶。
許可權的定義如下:
- R 表示只讀
- RW 表示可讀或推送更改,但不能刪除 git ref
- RW+ 表示可讀、可寫,而且可以刪除 git ref
推送修改後,我們就成功為新用戶創建了一個倉庫,並賦予了充足的許可權。
用戶 pythontg 可以這樣在本地克隆該庫:
git clone git@qcloud-cvm-ip:pythontg
純粹個人使用的 Git 伺服器
到此為止,我們已經完成了 Gitolite 的配置,擁有了一個可供多名用戶協作的私有 Git 伺服器。我們按照上面的類似步驟,將應用的代碼庫添加到 Gitolite,並推送到伺服器上。
如果你只想要一個供個人使用的 Git 伺服器,那麼只需要在擁有 SSH 登陸許可權的賬戶下創建一個裸倉庫(bare repository)即可。
mkdir -p /var/reponsudo chmod 700 /var/reponcd /var/repongit init --bare codingpy.gitn
然後在本地機器上,進入你已有的應用目錄。如果已經有本地 Git 倉庫,可以修改 remote 設置:
git remote set-url origin earlgrey@qcloud-cvm-ip:/var/repo/codingpy.git
如果是一個新倉庫,可以這樣操作:
git init && git remote add origin earlgrey@qcloud-cvm-ip:/var/repo/codingpy.git
上述命令中的用戶名、IP 地址及倉庫地址,請根據自身的情況修改。
結語
到目前為止,Git 伺服器的配置就完成了。參考上述操作,我將編程派網站的倉庫放置到了新的伺服器上,再也不用忍受慢速 Git 拉取了。
推薦閱讀:
※一個奇怪的git問題,求大家幫忙分析一下?
※在使用git的過程中 為什麼要是使用命令行?
※.Net控制Git.exe進程交互遇到的問題?