# 公共訪問

匿名的讀取許可權該怎麼實現呢？也許除了內部私有的專案之外，你還需要託管一些開源專案。或者因為要用一些自動化的伺服器來進行編譯，或者有一些經常變化的伺服器群組，而又不想整天生成新的 SSH 金鑰 — 總之，你需要簡單的匿名讀取許可權。

或許對小型的配置來說最簡單的辦法就是運行一個靜態 web 服務，把它的根目錄設定為 Git 倉庫所在的位置，然後開啟本章第一節提到的 `post-update` 掛鉤。這裡繼續使用之前的例子。假設倉庫處於 `/opt/git` 目錄，主機上運行著 Apache 服務。重申一下，任何 web 服務程式都可以達到相同效果；作為範例，我們將用一些基本的 Apache 設定來展示大體需要的步驟。

首先，開啟掛鉤：

```
$ cd project.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update
```

`post-update` 掛鉤是做什麼的呢？其內容大致如下：

```
$ cat .git/hooks/post-update
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
#

exec git-update-server-info
```

意思是當通過 SSH 向伺服器推送時，Git 將運行這個 `git-update-server-info` 命令來更新匿名 HTTP 訪問獲取資料時所需要的檔。

接下來，在 Apache 設定檔中添加一個 VirtualHost 條目，把文檔根目錄設為 Git 專案所在的根目錄。這裡我們假定 DNS 服務已經配置好，會把對 `.gitserver` 的請求發送到這台主機：

&#x20;ServerName git.gitserver DocumentRoot /opt/git Order allow, deny allow from all

另外，需要把 `/opt/git` 目錄的 Unix 使用者組設定為 `www-data` ，這樣 web 服務才可以讀取倉庫內容，因為運行 CGI 腳本的 Apache 實例進程預設就是以該使用者的身份起來的：

```
$ chgrp -R www-data /opt/git
```

重啟 Apache 之後，就可以通過專案的 URL 來克隆該目錄下的倉庫了。

```
$ git clone http://git.gitserver/project.git
```

這一招可以讓你在幾分鐘內為相當數量的用戶架設好基於 HTTP 的讀取許可權。另一個提供非授權訪問的簡單方法是開啟一個 Git 守護進程，不過這將要求該進程作為後臺進程常駐 — 接下來的這一節就要討論這方面的細節。
