Git --everything-is-local

4.5 伺服器上的 Git - 公共訪問

公共訪問

匿名的讀取許可權該怎麼實現呢?也許除了內部私有的專案之外,你還需要託管一些開源專案。或者因為要用一些自動化的伺服器來進行編譯,或者有一些經常變化的伺服器群組,而又不想整天生成新的 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 的請求發送到這台主機:

<VirtualHost *:80>
    ServerName git.gitserver
    DocumentRoot /opt/git
    <Directory /opt/git/>
        Order allow, deny
        allow from all
    </Directory>
</VirtualHost>

另外,需要把 /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 守護進程,不過這將要求該進程作為後臺進程常駐 — 接下來的這一節就要討論這方面的細節。