# 在服務器上搭建 Git
現在我們將討論如何在你自己的服務器上搭建 Git 服務來運行這些協議。
> 這里我們將要演示在 Linux 服務器上進行一次基本且簡化的安裝所需的命令與步驟,當然在 Mac 或 Windows 服務器上同樣可以運行這些服務。事實上,在你的計算機基礎架構中建立一個生產環境服務器,將不可避免的使用到不同的安全措施與操作系統工具。但是,希望你能從本節中獲得一些必要的知識。
在開始架設 Git 服務器前,需要把現有倉庫導出為裸倉庫——即一個不包含當前工作目錄的倉庫。這通常是很簡單的。為了通過克隆你的倉庫來創建一個新的裸倉庫,你需要在克隆命令后加上 `--bare`選項按照慣例,裸倉庫目錄名以 .git 結尾,就像這樣:
~~~
$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.
~~~
現在,你的 `my_project.git` 目錄中應該有 Git 目錄的副本了。
整體上效果大致相當于
~~~
$ cp -Rf my_project/.git my_project.git
~~~
雖然在配置文件中有若干不同,但是對于你的目的來說,這兩種方式都是一樣的。它只取出 Git 倉庫自身,不要工作目錄,然后特別為它單獨創建一個目錄。
## 把裸倉庫放到服務器上
既然你有了裸倉庫的副本,剩下要做的就是把裸倉庫放到服務器上并設置你的協議。假設一個域名為 `git.example.com` 的服務器已經架設好,并可以通過 SSH 連接,你想把所有的 Git 倉庫放在 `/opt/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 會自動修改該倉庫目錄的組權限為可寫。
~~~
$ ssh user@git.example.com
$ cd /opt/git/my_project.git
$ git init --bare --shared
~~~
由此可見,根據現有的 Git 倉庫創建一個裸倉庫,然后把它放上你和協作者都有 SSH 訪問權的服務器是多么容易。現在你們已經準備好在同一項目上展開合作了。
值得注意的是,這的確是架設一個幾個人擁有連接權的 Git 服務的全部——只要在服務器上加入可以用 SSH 登錄的帳號,然后把裸倉庫放在大家都有讀寫權限的地方。你已經準備好了一切,無需更多。
下面的幾節中,你會了解如何擴展到更復雜的設定。這些內容包含如何避免為每一個用戶建立一個賬戶,給倉庫添加公共讀取權限,架設網頁界面等等。然而,請記住這一點,如果只是和幾個人在一個私有項目上合作的話,*僅僅* 是一個 SSH 服務器和裸倉庫就足夠了。
## 小型安裝
如果設備較少或者你只想在小型開發團隊里嘗試 Git ,那么一切都很簡單。架設 Git 服務最復雜的地方在于用戶管理。如果需要倉庫對特定的用戶可讀,而給另一部分用戶讀寫權限,那么訪問和許可安排就會比較困難。
### SSH 連接
如果你有一臺所有開發者都可以用 SSH 連接的服務器,架設你的第一個倉庫就十分簡單了,因為你幾乎什么都不用做(正如我們上一節所說的)。如果你想在你的倉庫上設置更復雜的訪問控制權限,只要使用服務器操作系統的普通的文件系統權限就行了。
如果需要團隊里的每個人都對倉庫有寫權限,又不能給每個人在服務器上建立賬戶,那么提供 SSH 連接就是唯一的選擇了。我們假設用來共享倉庫的服務器已經安裝了 SSH 服務,而且你通過它訪問服務器。
有幾個方法可以使你給團隊每個成員提供訪問權。第一個就是給團隊里的每個人創建賬號,這種方法很直接但也很麻煩。或許你不會想要為每個人運行一次 `adduser` 并且設置臨時密碼。
第二個辦法是在主機上建立一個 *git* 賬戶,讓每個需要寫權限的人發送一個 SSH 公鑰,然后將其加入 git 賬戶的 `~/.ssh/authorized_keys` 文件。這樣一來,所有人都將通過 *git* 賬戶訪問主機。這一點也不會影響提交的數據——訪問主機用的身份不會影響提交對象的提交者信息。
另一個辦法是讓 SSH 服務器通過某個 LDAP 服務,或者其他已經設定好的集中授權機制,來進行授權。只要每個用戶可以獲得主機的 shell 訪問權限,任何 SSH 授權機制你都可視為是有效的。
- 前言
- Scott Chacon 序
- Ben Straub 序
- 獻辭
- 貢獻者
- 引言
- 1. 起步
- 1.1 關于版本控制
- 1.2 Git 簡史
- 1.3 Git 基礎
- 1.4 命令行
- 1.5 安裝 Git
- 1.6 初次運行 Git 前的配置
- 1.7 獲取幫助
- 1.8 總結
- 2. Git 基礎
- 2.1 獲取 Git 倉庫
- 2.2 記錄每次更新到倉庫
- 2.3 查看提交歷史
- 2.4 撤消操作
- 2.5 遠程倉庫的使用
- 2.6 打標簽
- 2.7 Git 別名
- 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 Git 守護進程
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管的選擇
- 4.10 總結
- 5. 分布式 Git
- 5.1 分布式工作流程
- 5.2 向一個項目貢獻
- 5.3 維護項目
- 5.4 總結
- 6. GitHub
- 6.1 賬戶的創建和配置
- 6.2 對項目做出貢獻
- 6.3 維護項目
- 6.4 管理組織
- 6.5 腳本 GitHub
- 6.6 總結
- 7. Git 工具
- 7.1 選擇修訂版本
- 7.2 交互式暫存
- 7.3 儲藏與清理
- 7.4 簽署工作
- 7.5 搜索
- 7.6 重寫歷史
- 7.7 重置揭密
- 7.8 高級合并
- 7.9 Rerere
- 7.10 使用 Git 調試
- 7.11 子模塊
- 7.12 打包
- 7.13 替換
- 7.14 憑證存儲
- 7.15 總結
- 8. 自定義 Git
- 8.1 配置 Git
- 8.2 Git 屬性
- 8.3 Git 鉤子
- 8.4 使用強制策略的一個例子
- 8.5 總結
- 9. Git 與其他系統
- 9.1 作為客戶端的 Git
- 9.2 遷移到 Git
- 9.3 總結
- 10. Git 內部原理
- 10.1 底層命令和高層命令
- 10.2 Git 對象
- 10.3 Git 引用
- 10.4 包文件
- 10.5 引用規格
- 10.6 傳輸協議
- 10.7 維護與數據恢復
- 10.8 環境變量
- 10.9 總結
- A. 其它環境中的 Git
- A1.1 圖形界面
- A1.2 Visual Studio 中的 Git
- A1.3 Eclipse 中的 Git
- A1.4 Bash 中的 Git
- A1.5 Zsh 中的 Git
- A1.6 Powershell 中的 Git
- A1.7 總結
- B. 將 Git 嵌入你的應用
- A2.1 命令行 Git 方式
- A2.2 Libgit2
- A2.3 JGit
- C. Git 命令
- A3.1 設置與配置
- A3.2 獲取與創建項目
- A3.3 快照基礎
- A3.4 分支與合并
- A3.5 項目分享與更新
- A3.6 檢查與比較
- A3.7 調試
- A3.8 補丁
- A3.9 郵件
- A3.10 外部系統
- A3.11 管理
- A3.12 底層命令