> For the complete documentation index, see [llms.txt](https://willh.gitbook.io/gitpro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://willh.gitbook.io/gitpro/3898c8362c3f1668ad4cfd6649caa064/09d6e4f56c28018c2b7f69a1ce55d305.md).

# 在伺服器上部署 Git

開始架設 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 授權機制都能達到相同效果。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://willh.gitbook.io/gitpro/3898c8362c3f1668ad4cfd6649caa064/09d6e4f56c28018c2b7f69a1ce55d305.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
