Git 在服務(wù)器上部署

2018-09-27 15:41 更新

開始架設(shè) Git 服務(wù)器前,需要先把現(xiàn)有倉庫導(dǎo)出為裸倉庫 — 即一個(gè)不包含當(dāng)前工作目錄的倉庫。做法直截了當(dāng),克隆時(shí)用 --bare 選項(xiàng)即可。裸倉庫的目錄名一般以 .git 結(jié)尾,像這樣:

$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.

該命令的輸出或許會讓人有些不解。其實(shí) clone 操作基本上相當(dāng)于 git initgit fetch,所以這里出現(xiàn)的其實(shí)是 git init 的輸出,先由它建立一個(gè)空目錄,而之后傳輸數(shù)據(jù)對象的操作并無任何輸出,只是悄悄在幕后執(zhí)行。現(xiàn)在 my_project.git 目錄中已經(jīng)有了一份 Git 目錄數(shù)據(jù)的副本。

整體上的效果大致相當(dāng)于:

$ cp -Rf my_project/.git my_project.git
但在配置文件中有若干小改動,不過對用戶來講,使用方式都一樣,不會有什么影響。它僅取出 Git 倉庫的必要原始數(shù)據(jù),存放在該目錄中,而不會另外創(chuàng)建工作目錄。

把裸倉庫移到服務(wù)器上

有了裸倉庫的副本后,剩下的就是把它放到服務(wù)器上并設(shè)定相關(guān)協(xié)議。假設(shè)一個(gè)域名為 git.example.com 的服務(wù)器已經(jīng)架設(shè)好,并可以通過 SSH 訪問,我們打算把所有 Git 倉庫儲存在 /opt/git 目錄下。只要把裸倉庫復(fù)制過去:

$ scp -r my_project.git user@git.example.com:/opt/git
現(xiàn)在,所有對該服務(wù)器有 SSH 訪問權(quán)限,并可讀取 /opt/git 目錄的用戶都可以用下面的命令克隆該項(xiàng)目:

$ git clone user@git.example.com:/opt/git/my_project.git

如果某個(gè) SSH 用戶對 /opt/git/my_project.git 目錄有寫權(quán)限,那他就有推送權(quán)限。如果到該項(xiàng)目目錄中運(yùn)行git init 命令,并加上 --shared 選項(xiàng),那么 Git 會自動修改該倉庫目錄的組權(quán)限為可寫(譯注:實(shí)際上 --shared 可以指定其他行為,只是默認(rèn)為將組權(quán)限改為可寫并執(zhí)行g+sx,所以最后會得到 rws。)。

$ ssh user@git.example.com
$ cd /opt/git/my_project.git
$ git init --bare --shared

由此可見,根據(jù)現(xiàn)有的 Git 倉庫創(chuàng)建一個(gè)裸倉庫,然后把它放上你和同事都有 SSH 訪問權(quán)的服務(wù)器是多么容易?,F(xiàn)在已經(jīng)可以開始在同一項(xiàng)目上密切合作了。

值得注意的是,這的的確確是架設(shè)一個(gè)少數(shù)人具有連接權(quán)的 Git 服務(wù)的全部 — 只要在服務(wù)器上加入可以用 SSH 登錄的帳號,然后把裸倉庫放在大家都有讀寫權(quán)限的地方。一切都準(zhǔn)備停當(dāng),無需更多。

下面的幾節(jié)中,你會了解如何擴(kuò)展到更復(fù)雜的設(shè)定。這些內(nèi)容包含如何避免為每一個(gè)用戶建立一個(gè)賬戶,給倉庫添加公共讀取權(quán)限,架設(shè)網(wǎng)頁界面,使用 Gitosis 工具等等。然而,只是和幾個(gè)人在一個(gè)不公開的項(xiàng)目上合作的話,僅僅是一個(gè) SSH 服務(wù)器和裸倉庫就足夠了,記住這點(diǎn)就可以了。

小型安裝

如果設(shè)備較少或者你只想在小型開發(fā)團(tuán)隊(duì)里嘗試 Git ,那么一切都很簡單。架設(shè) Git 服務(wù)最復(fù)雜的地方在于賬戶管理。如果需要倉庫對特定的用戶可讀,而給另一部分用戶讀寫權(quán)限,那么訪問和許可的安排就比較困難。

SSH 連接

如果已經(jīng)有了一個(gè)所有開發(fā)成員都可以用 SSH 訪問的服務(wù)器,架設(shè)第一個(gè)服務(wù)器將變得異常簡單,幾乎什么都不用做(正如上節(jié)中介紹的那樣)。如果需要對倉庫進(jìn)行更復(fù)雜的訪問控制,只要使用服務(wù)器操作系統(tǒng)的本地文件訪問許可機(jī)制就行了。

如果需要團(tuán)隊(duì)里的每個(gè)人都對倉庫有寫權(quán)限,又不能給每個(gè)人在服務(wù)器上建立賬戶,那么提供 SSH 連接就是唯一的選擇了。我們假設(shè)用來共享倉庫的服務(wù)器已經(jīng)安裝了 SSH 服務(wù),而且你通過它訪問服務(wù)器。

有好幾個(gè)辦法可以讓團(tuán)隊(duì)的每個(gè)人都有訪問權(quán)。第一個(gè)辦法是給每個(gè)人建立一個(gè)賬戶,直截了當(dāng)?shù)赃^繁瑣。反復(fù)運(yùn)行 adduser 并給所有人設(shè)定臨時(shí)密碼可不是好玩的。

第二個(gè)辦法是在主機(jī)上建立一個(gè) git 賬戶,讓每個(gè)需要寫權(quán)限的人發(fā)送一個(gè) SSH 公鑰,然后將其加入 git 賬戶的~/.ssh/authorized_keys 文件。這樣一來,所有人都將通過 git 賬戶訪問主機(jī)。這絲毫不會影響提交的數(shù)據(jù) — 訪問主機(jī)用的身份不會影響提交對象的提交者信息。

另一個(gè)辦法是讓 SSH 服務(wù)器通過某個(gè) LDAP 服務(wù),或者其他已經(jīng)設(shè)定好的集中授權(quán)機(jī)制,來進(jìn)行授權(quán)。只要每個(gè)人都能獲得主機(jī)的 shell 訪問權(quán),任何可用的 SSH 授權(quán)機(jī)制都能達(dá)到相同效果。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號