公共訪問
匿名的讀取許可權該怎麼實現呢?也許除了內部私有的專案之外,你還需要託管一些開源專案。或者因為要用一些自動化的伺服器來進行編譯,或者有一些經常變化的伺服器群組,而又不想整天生成新的 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 守護進程,不過這將要求該進程作為後臺進程常駐 — 接下來的這一節就要討論這方面的細節。