Pro Git 4.5 公開存取

出自DILA Wiki

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

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

首先,開啟掛鉤:

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

假如使用的 Git 版本小於 1.6,那 mv 命令可以省略—— Git 是從較晚的版本才開始在掛鉤實例的結尾添加 .sample 尾碼名的。

post-update 掛鉤是做什麼的呢?其內容大致如下:

$ cat .git/hooks/post-update 
#!/bin/sh
exec git-update-server-info

意思是當通過 SSH 向伺服器推送時,Git 將執行這個命令來更新 HTTP 獲取所需的檔。

下一步,你需要在 Apache 設定檔中添加一個 VirtualHost 條目,把 DocumentRoot 參數設定為 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 服務才可以讀取倉庫內容,因為 Apache 運行 CGI 腳本的模組(預設)使用的是該用戶:

$ chgrp -R www-data /opt/git

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

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

這一招可以讓你在幾分鐘內為相當數量的用戶架設好基於 HTTP 的讀取許可權。另一個提供非授權訪問的簡單方法是開啟一個 Git 守護進程,不過這將要求該進程(process)的常駐,我們將在下一節討論這部份,如果你傾向走這條路的話。