如何搭建私有可協作的 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進程交互遇到的問題?

TAG:Git | 编程学习 | 云计算 |