# 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），進入註冊頁面。

![](http://git-scm.com/figures/18333fig0402-tn.png)

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

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

![](http://git-scm.com/figures/18333fig0403-tn.png)

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

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

![](http://git-scm.com/figures/18333fig0404-tn.png)

圖 4-4. GitHub 的用戶面板

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

## 建立新倉庫

點擊用戶面板上倉庫旁邊的 "create a new one" 連結，顯示 Create a New Repository 的表單（見圖 4-5）：

![](http://git-scm.com/figures/18333fig0405-tn.png)

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

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

![](http://git-scm.com/figures/18333fig0406-tn.png)

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

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

![](http://git-scm.com/figures/18333fig0407-tn.png)

圖 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）：

![](http://git-scm.com/figures/18333fig0408-tn.png)

圖 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）：

![](http://git-scm.com/figures/18333fig0409-tn.png)

圖 4-9. Subversion 導入介面

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

## 添加協作開發者

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

點擊專案頁面上方的 "edit" 按鈕或者頂部的 Admin 標籤，進入該專案的管理頁面（見圖 4-10）：

![](http://git-scm.com/figures/18333fig0410-tn.png)

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

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

![](http://git-scm.com/figures/18333fig0411-tn.png)

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

添加完協作者之後，就可以在 Repository Collaborators 區域看到他們的名單（見圖 4-12）：

![](http://git-scm.com/figures/18333fig0412-tn.png)

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

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

## 專案頁面

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

![](http://git-scm.com/figures/18333fig0413-tn.png)

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

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

## 派生項目

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

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

要派生一個專案，到原始專案的頁面（本例中是 mojombo/chronic）點擊 "fork" 按鈕（見圖 4-14）：

![](http://git-scm.com/figures/18333fig0414-tn.png)

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

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

![](http://git-scm.com/figures/18333fig0415-tn.png)

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

## GitHub 小結

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