Git --distributed-is-the-new-centralized

4.10 伺服器上的 Git - Git 託管服務

Git 託管服務

如果不想經歷自己架設 Git 伺服器的麻煩,網路上有幾個專業的倉庫託管服務可供選擇。這樣做有幾大優點:託管帳戶的建立通常比較省時,方便專案的啟動,而且不涉及伺服器的維護和監控。即使內部創建並運行著自己的伺服器,同時為開源項目提供一個公共託管網站還是有好處的 — 讓開源社區更方便地找到該專案,並給予幫助。

目前,可供選擇的託管服務數量繁多,各有利弊。在 Git 官方 wiki 上的 Githosting 頁面有一個最新的託管服務清單:

https://git.wiki.kernel.org/index.php/GitHosting

由於本書無法全部一一介紹,而本人(譯注:指本書作者 Scott Chacon。)剛好在其中一家公司工作,所以接下來我們將會介紹如何在 GitHub 上建立新帳戶並啟動專案。至於其他託管服務大體也是這麼一個過程,基本的想法都是差不多的。

GitHub 是目前為止最大的開源 Git 託管服務,並且還是少數同時提供公共代碼和私有代碼託管服務的網站之一,所以你可以在上面同時保存開源和商業代碼。事實上,本書就是放在 GitHub 上合作編著的。(譯注:本書的翻譯也是放在 GitHub 上廣泛協作的。)

GitHub

GitHub 和大多數的代碼託管網站在處理專案命名空間的方式上略有不同。GitHub 的設計更側重於用戶,而不是完全基於專案。也就是說,如果我在 GitHub 上託管一個名為 grit 的項目的話,它的位址不會是 github.com/grit,而是按在用戶底下 github.com/shacon/grit (譯注:本書作者 Scott Chacon 在 GitHub 上的用戶名是 shacon。)。不存在所謂某個項目的官方版本,所以假如第一作者放棄了某個項目,它可以無縫轉移到其它用戶的名下。

GitHub 同時也是一個向使用私有倉庫的用戶收取費用的商業公司,但任何人都可以方便快捷地申請到一個免費帳戶,並在上面託管數量不限的開源項目。接下來我們快速介紹一下 GitHub 的基本使用。

建立新帳戶

首先註冊一個免費帳戶。訪問 Pricing and Signup 頁面 http://github.com/plans 並點擊 Free acount 裡的 Sign Up 按鈕(見圖 4-2),進入註冊頁面。


圖 4-2. GitHub 服務簡介頁面

選擇一個系統中尚未使用的用戶名,提供一個與之相關聯的電郵位址,並輸入密碼(見圖 4-3):


圖 4-3. GitHub 用戶註冊表單

如果方便,現在就可以提供你的 SSH 公開金鑰。我們在前文的"小型安裝" 一節介紹過生成新公開金鑰的方法。把新生成的公開金鑰複製粘貼到 SSH Public Key 文字方塊中即可。要是對生成公開金鑰的步驟不太清楚,也可以點擊 "explain ssh keys" 連結,會顯示各個主流作業系統上完成該步驟的介紹。 點擊 "I agree,sign me up" 按鈕完成使用者註冊,並轉到該使用者的 dashboard 頁面(見圖 4-4):


圖 4-4. GitHub 的用戶面板

接下來就可以建立新倉庫了。

建立新倉庫

點擊用戶面板上倉庫旁邊的 "create a new one" 連結,顯示 Create a New Repository 的表單(見圖 4-5):


圖 4-5. 在 GitHub 上建立新倉庫

當然,項目名稱是必不可少的,此外也可以適當描述一下專案的情況或者給出官方網站的位址。然後點擊 "Create Repository" 按鈕,新倉庫就建立起來了(見圖 4-6):


圖 4-6. GitHub 上各個專案的概要資訊

由於尚未提交代碼,點擊專案位址後 GitHub 會顯示一個簡要的指南,告訴你如何新建一個專案並推送上來,如何從現有項目推送,以及如何從一個公共的 Subversion 倉庫導入項目(見圖 4-7):


圖 4-7. 新倉庫指南

該指南和本書前文介紹的類似,對於新的專案,需要先在本地初始化為 Git 專案,添加要管理的檔並作首次提交:

$ git init
$ git add .
$ git commit -m 'initial commit'

然後在這個本地倉庫內把 GitHub 添加為遠端倉庫,並推送 master 分支上來:

$ git remote add origin git@github.com:testinguser/iphone_project.git
$ git push origin master

現在該項目就託管在 GitHub 上了。你可以把它的 URL 分享給每位對此項目感興趣的人。本例的 URL 是 http://github.com/testinguser/iphone_project。而在專案頁面的摘要部分,你會發現有兩個 Git URL 位址(見圖 4-8):


圖 4-8. 項目摘要中的公共 URL 和私有 URL

Public Clone URL 是一個公開的,唯讀的 Git URL,任何人都可以通過它克隆該專案。可以隨意散播這個 URL,比如發佈到個人網站之類的地方等等。

Your Clone URL 是一個基於 SSH 協議的可讀可寫 URL,只有使用與上傳的 SSH 公開金鑰對應的金鑰來連接時,才能通過它進行讀寫操作。其他使用者訪問該專案頁面時只能看到之前那個公共的 URL,看不到這個私有的 URL。

從 Subversion 導入項目

如果想把某個公共 Subversion 項目導入 Git,GitHub 可以幫忙。在指南的最後有一個指嚮導入 Subversion 頁面的連結。點擊它會看到一個表單,包含有關導入流程的資訊以及一個用來粘貼公共 Subversion 項目連接的文字方塊(見圖 4-9):


圖 4-9. Subversion 導入介面

如果專案很大,採用非標準結構,或者是私有的,那就無法借助該工具實現導入。到第 7 章,我們會介紹如何手工導入複雜工程的具體方法。

添加協作開發者

現在把團隊裡的其他人也加進來。如果 John,Josie 和 Jessica 都在 GitHub 註冊了帳戶,要賦予他們對該倉庫的推送許可權,可以把他們加為專案協作者。這樣他們就可以通過各自的公開金鑰訪問我的這個倉庫了。

點擊專案頁面上方的 "edit" 按鈕或者頂部的 Admin 標籤,進入該專案的管理頁面(見圖 4-10):


圖 4-10. GitHub 的專案管理頁面

為了給另一個用戶添加項目的寫許可權,點擊 "Add another collaborator" 連結,出現一個用於輸入用戶名的表單。在輸入的同時,它會自動跳出一個符合條件的候選名單。找到正確用戶名之後,點 Add 按鈕,把該使用者設為專案協作者(見圖 4-11):


圖 4-11. 為專案添加協作者

添加完協作者之後,就可以在 Repository Collaborators 區域看到他們的名單(見圖 4-12):


圖 4-12. 專案協作者名單

如果要取消某人的訪問權,點擊 "revoke" 即可取消他的推送許可權。對於將來的專案,你可以從現有專案複製協作者名單,或者直接借用協作者群組。

專案頁面

在推送或從 Subversion 導入項目之後,你會看到一個類似圖 4-13 的項目主頁:


圖 4-13. GitHub 上的項目主頁

別人訪問你的專案時看到的就是這個頁面。它有若干導航標籤,Commits 標籤用於顯示提交歷史,最新的提交位於最上方,這和 git log 命令的輸出類似。Network 標籤展示所有派生了該專案並做出貢獻的用戶的關係圖譜。Downloads 標籤允許你上傳項目的二進位檔案,提供下載該項目各個版本的 tar/zip 包。Wiki 標籤提供了一個用於撰寫文檔或其他專案相關資訊的 wiki 網站。Graphs 標籤包含了一些視覺化的專案資訊與資料。預設打開的 Source 標籤頁面,則列出了該專案的目錄結構和概要資訊,並在下方自動展示 README 檔的內容(如果該檔存在的話),此外還會顯示最近一次提交的相關資訊。

派生項目

如果要為一個自己沒有推送許可權的項目貢獻代碼,GitHub 鼓勵使用派生(fork)。到那個感興趣的項目主頁上,點擊頁面上方的 "fork" 按鈕,GitHub 就會為你複製一份該項目的副本到你的倉庫中,這樣你就可以向自己的這個副本推送資料了。

採取這種辦法的好處是,專案擁有者不必忙於應付賦予他人推送許可權的工作。隨便誰都可以通過派生得到一個專案副本並在其中展開工作,事後只需要專案維護者將這些副本倉庫加為遠端倉庫,然後提取更新合併即可。

要派生一個專案,到原始專案的頁面(本例中是 mojombo/chronic)點擊 "fork" 按鈕(見圖 4-14):


圖 4-14. 點擊 "fork" 按鈕獲得任意專案的可寫副本

幾秒鐘之後,你將進入新建的專案頁面,會顯示該專案派生自哪一個項目(見圖 4-15):


圖 4-15. 派生後得到的項目副本

GitHub 小結

關於 GitHub 就先介紹這麼多,能夠快速達成這些事情非常重要(譯注:門檻的降低和完成基本任務的簡單高效,對於推動開源專案的協作發展有著舉足輕重的意義。)。短短幾分鐘內,你就能創建一個新帳戶,添加一個專案並開始推送。如果專案是開源的,整個龐大的開發者社區都可以立即訪問它,提供各式各樣的幫助和貢獻。最起碼,這也是一種 Git 新手立即體驗嘗試 Git 的捷徑。