Git 是時下最流行的版本控制工具。它能在 Windows、Mac 或 Linux 電腦上,以資料夾為專案單位,對專案內的程式碼、以及不拘格式的檔案內容進行版本控制(型態管理/型管)。版本間的檔案甚至是程式碼片段,皆能找查、比對、回朔與復原。
Git 也提供分支操作(Branch),讓使用者同時管理像是「主要版本分支/測試版本分支」、「穩定版本分支/開發版本分支/即時錯誤修正分支」…等的版本開發流。
Git 支援分散式遠端架構,讓個人或團隊,甚至是網路社群,建立起無論是中心式型管資料庫、又或者像是 GitHub 這一類以 pull-request 為基礎的平行式協作架構。

本篇集合了本人過去為打造 Git 協作平台的各種嘗試,關注於如何簡單地建立起適合個人或小團隊的 Git 遠端操作/協作平台。以下內容適合對於 Git 遠端操作有初步理解以及有過伺服器管理經驗的人。
若對於 Git 操作還不懂,可以參考 Pro Git 中文書。
Git 中心式架構
在中心式架構下,所有協作者手上的專案版本(以下以「本機版本」稱之),都需要與遠端伺服器上的專案版本同步(以下以「遠端版本」稱之)。若遠端版本較新,需下載(git pull)並與本機版本合併(git merge),方能上傳(git push)並更新遠端版本。
上述的合併操作(pull-merge-push cycle),也是中心式架構主要協作手段。
在中心式架構下,所有協作者皆有權限更(ㄌㄨㄢˋ)新(ㄍㄠˇ)遠端版本,因此適合緊密與默契良好的團隊。
透過 ssh 伺服器
難度:★★☆☆☆
這個方法比較正規而且單純,只要架起一個有 ssh 功能的伺服器就行了。細節可參見 Pro Git 中文書的這一章。
把本機版本 bare 出一個專案放在伺服器上,協作者就能 git clone 並開始後續的 push 與 pull 操作。
在 ssh 協定下,建議為協作者們建立 ssh key pair,在遠端操作時就不用頻繁的敲密碼了。
透過 dropbox 大法
難度:★☆☆☆☆
這個方法需要所有協作者都有 dropbox 帳號,並共享其中一個資料夾。遠端版本就存放在該資料夾上。因此在 push 與 pull 操作時,是把本機版本 push 到或者 pull 自一樣位在本機上的 dropbox 資料夾。
對於有在使用雲端空間的人,以本人的經驗來說,不建議把本機版本放在如 dropbox 的雲端資料夾上。如果你不協作,但是有備份或同步至多台電腦的需求,建議你把本機版本放在非雲端資料夾上,並透過 push 與 pull 操作同步至不同的電腦上。
同理,上述方法在如 smb 的網路硬碟上也適用。
透過 ssh + http 伺服器
難度:★★★☆☆
這個方法同「ssh 伺服器」,輔以 web server 所用的 https 協定後,可以提供非協作者以唯讀的方法下載(git clone)專案版本。只要將遠端版本放在 web server 中如 */www 或 */pulic_html 的目錄下,並打開 post-update 的 hook 即可。詳細設定參見 Pro Git 中文書這一章。
這個方法提供第三方唯讀預覽的功能,可用做專案進度監視的一種手段。小團隊在使用上,建議限制 web server 只能在區網(intranet)存取,或者設定一個唯讀帳號並透過 .htaccess 限制存取。
Git 分散式提交審核架構
這種架構的精神是,由一個或多個人組成的審核者(專案管理員)維護一個核心的遠端版本,協作者複製(fork)該核心的遠端版本成為自己的遠端版本,修改後提交(pull-request)給審核者。審核者拉取(pull)協作者的遠端版本,認可後合併(merge)至核心的遠端版本上。上述 fork + pull-request 的方式,也是該架構的主要協作手段。
在這之中,無論是審核者或協作者,都是修改並更新(push)自己的本機版本或遠端版本。審核者與協作者們之間無法更改彼此的專案版本(但能讀取),對於專案品質與安全性有了更進一步的掌握,因此適合中型或大型開發團隊,或小但對於彼此不信任的團隊。
分散式架構能更進一步地發展成為不限定主從關係(審核者/協作者)、而是有更多階層的工作流程。詳見 Pro Git 中文書的這一章。
一般使用者要自己打造這種環境比較麻煩。以下只介紹幾個便捷的方法。
透過線上服務,如 GitHub
難度:不需設定

申請一個帳號,就能使用 GitHub 完成 fork + pull-request 流程。不過 GitHub 免費會員只提供公開瀏覽的選項,並不適合私人團隊。至少月費 7 美金才能擁有 5 個非公開的專案選項。如果你的團隊有資安考量,這類雲端服務便完全不合適。
(公事上不行的話,私底下在 GitHub 上搞一些開源專案也不錯)
透過非雲端的 GitLab
GitLab 是一個開源的 Linux 套件服務,可以在自己的伺服務上架起完整的類似 GitHub 支援 fork 與 pull-request 的服務。

對於已有伺服器硬體的人,可以到 Binami 的網頁下載安裝檔,並逐步設定。詳見此。(難度:★★★★★)
怕麻煩或是有終端機恐懼的人,建議下載 GitLab 虛擬機或 docker 映象檔,透過像是 Virtual Box 這一類虛擬機軟體,就能在無論是 Windows、Mac 或 linux 上懶人啟動整個服務。等於是抱了一台安裝好 GitLab 服務的 linux 電腦(虛擬的)並在自己的電腦(實體的)上跑。詳見此。(難度:★★★☆☆)
GitLab 服務起來後,管理者便能新增使用者,並進行 fork + pull-request (GitLab 改稱為 merge-request)協作。就如同在 GitHub 上一樣。

透過 dropbox 大法?
難度:不難,但很麻煩
在 dropbox 上完成 fork + pull-request 的協作當然也可行,雖然沒有花費,但是比較麻煩。
流程如下:
- 審核者在 dropbox 下 bare 一個專案,與本機版本同步(只 push)。
- 協作者透過審核者分享在 dropbox 上的專案,下載到協作者自己的 dropbox 上,再 clone 到本機版本進行修改(因為這個版本是等於是 fork 的,不 pull 直接改 dropbox 上的也行)。這個動作類似 fork + sync。
- 協作者修改完專案,分享給審核者。這個動作類似 pull-request。
- 審核者下載協作者的專案到自己的 dropbox 上並 fetch + merge 。結束 pull-request 流程。
(過程要複製來複製去的,有些複製完就要刪。光想就覺得很煩。)
對於已經擁有付費或企業版帳號的人,可以透過 dropbox 共享資料夾來存放有權限的 main 或 fork 專案,也是另一種手段。
後話
對於 Git 中心式協作,若你已有主機,建議使用 ssh 或 ssh + https 架構;沒有主機且無資安考量,用 dropbox 架構即可。
對於 Git 分散式提交審核協作,GitLab 虛擬機是最簡單的,不需要伺服器,只要一台個人電腦,就能擁有最流行的 fork + pull-request 的協作方式。
ps: 本作者是名中央大學不煙不酒不務正業的煙酒生
發表迴響