開始架設 Git 服務器前,需要先把現有倉庫導出為裸倉庫 — 即一個不包含當前工作目錄的倉庫。做法直截了當,克隆時用 `--bare` 選項即可。裸倉庫的目錄名一般以 `.git` 結尾,像這樣:
~~~
$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.
~~~
該命令的輸出或許會讓人有些不解。其實 clone 操作基本上相當于 `git init` 加 `git fetch`,所以這里出現的其實是 `git init` 的輸出,先由它建立一個空目錄,而之后傳輸數據對象的操作并無任何輸出,只是悄悄在幕后執行。現在 `my_project.git` 目錄中已經有了一份 Git 目錄數據的副本。
整體上的效果大致相當于:
`$ cp -Rf my_project/.git my_project.git`
但在配置文件中有若干小改動,不過對用戶來講,使用方式都一樣,不會有什么影響。它僅取出 Git 倉庫的必要原始數據,存放在該目錄中,而不會另外創建工作目錄。
## 把裸倉庫移到服務器上
有了裸倉庫的副本后,剩下的就是把它放到服務器上并設定相關協議。假設一個域名為 git.example.com 的服務器已經架設好,并可以通過 SSH 訪問,我們打算把所有 Git 倉庫儲存在 `/opt/git` 目錄下。只要把裸倉庫復制過去:
`$ scp -r my_project.git user@git.example.com:/opt/git`
現在,所有對該服務器有 SSH 訪問權限,并可讀取 `/opt/git` 目錄的用戶都可以用下面的命令克隆該項目:
`$ git clone user@git.example.com:/opt/git/my_project.git`
如果某個 SSH 用戶對 `/opt/git/my_project.git` 目錄有寫權限,那他就有推送權限。如果到該項目目錄中運行` git init` 命令,并加上 `--shared` 選項,那么 Git 會自動修改該倉庫目錄的組權限為可寫(譯注:實際上 `--shared` 可以指定其他行為,只是默認為將組權限改為可寫并執行` g+sx`,所以最后會得到 `rws`。)。
~~~
$ ssh user@git.example.com
$ cd /opt/git/my_project.git
$ git init --bare --shared
~~~
由此可見,根據現有的 Git 倉庫創建一個裸倉庫,然后把它放上你和同事都有 SSH 訪問權的服務器是多么容易。現在已經可以開始在同一項目上密切合作了。
值得注意的是,這的的確確是架設一個少數人具有連接權的 Git 服務的全部 — 只要在服務器上加入可以用 SSH 登錄的帳號,然后把裸倉庫放在大家都有讀寫權限的地方。一切都準備停當,無需更多。
下面的幾節中,你會了解如何擴展到更復雜的設定。這些內容包含如何避免為每一個用戶建立一個賬戶,給倉庫添加公共讀取權限,架設網頁界面,使用 Gitosis 工具等等。然而,只是和幾個人在一個不公開的項目上合作的話,僅僅是一個 SSH 服務器和裸倉庫就足夠了,記住這點就可以了。
## 小型安裝
如果設備較少或者你只想在小型開發團隊里嘗試 Git ,那么一切都很簡單。架設 Git 服務最復雜的地方在于賬戶管理。如果需要倉庫對特定的用戶可讀,而給另一部分用戶讀寫權限,那么訪問和許可的安排就比較困難。
## SSH 連接
如果已經有了一個所有開發成員都可以用 SSH 訪問的服務器,架設第一個服務器將變得異常簡單,幾乎什么都不用做(正如上節中介紹的那樣)。如果需要對倉庫進行更復雜的訪問控制,只要使用服務器操作系統的本地文件訪問許可機制就行了。
如果需要團隊里的每個人都對倉庫有寫權限,又不能給每個人在服務器上建立賬戶,那么提供 SSH 連接就是唯一的選擇了。我們假設用來共享倉庫的服務器已經安裝了 SSH 服務,而且你通過它訪問服務器。
有好幾個辦法可以讓團隊的每個人都有訪問權。第一個辦法是給每個人建立一個賬戶,直截了當但略過繁瑣。反復運行 adduser 并給所有人設定臨時密碼可不是好玩的。
第二個辦法是在主機上建立一個 git 賬戶,讓每個需要寫權限的人發送一個 SSH 公鑰,然后將其加入 git 賬戶的` ~/.ssh/authorized_keys` 文件。這樣一來,所有人都將通過 git 賬戶訪問主機。這絲毫不會影響提交的數據 — 訪問主機用的身份不會影響提交對象的提交者信息。
另一個辦法是讓 SSH 服務器通過某個 LDAP 服務,或者其他已經設定好的集中授權機制,來進行授權。只要每個人都能獲得主機的 shell 訪問權,任何可用的 SSH 授權機制都能達到相同效果。
- 1. 起步
- 1.1 關于版本控制
- 1.2 Git 簡史
- 1.3 Git 基礎
- 1.4 安裝 Git
- 1.5 初次運行 Git 前的配置
- 1.6 獲取幫助
- 1.7 小結
- 2. Git基礎
- 2.1 取得項目的 Git 倉庫
- 2.2 記錄每次更新到倉庫
- 2.3 查看提交歷史
- 2.4 撤消操作
- 2.5 遠程倉庫的使用
- 2.6 打標簽
- 2.7 技巧和竅門
- 2.8 小結
- 3. Git分支
- 3.1 何謂分支
- 3.2 分支的新建與合并
- 3.3 分支的管理
- 3.4 利用分支進行開發的工作流程
- 3.5 遠程分支
- 3.6 分支的衍合
- 3.7 小結
- 4. 服務器上的Git
- 4.1 協議
- 4.2 在服務器上部署 Git
- 4.3 生成 SSH 公鑰
- 4.4 架設服務器
- 4.5 公共訪問
- 4.6 GitWeb
- 4.7 Gitosis
- 4.8 Gitolite
- 4.9 Git 守護進程
- 4.10 Git 托管服務
- 4.11 小結
- 5. 分布式Git
- 5.1 分布式工作流程
- 5.2 為項目作貢獻
- 5.3 項目的管理
- 5.4 小結
- 6. Git工具
- 6.1 修訂版本(Revision)選擇
- 6.2 交互式暫存
- 6.3 儲藏(Stashing)
- 6.4 重寫歷史
- 6.5 使用 Git 調試
- 6.6 子模塊
- 6.7 子樹合并
- 6.8 總結
- 7. 自定義Git
- 7.1 配置 Git
- 7.2 Git屬性
- 7.3 Git掛鉤
- 7.4 Git 強制策略實例
- 7.5 總結
- 8. Git與其他系統
- 8.1 Git 與 Subversion
- 8.2 遷移到 Git
- 8.3 總結
- 9. Git 內部原理
- 9.2 Git 對象
- 9.3 Git References
- 9.4 Packfiles
- 9.5 The Refspec
- 9.6 傳輸協議
- 9.7 維護及數據恢復
- 9.8 總結
- 9.1 底層命令 (Plumbing) 和高層命令 (Porcelain)