章節 ▾ 第二版

4.6 伺服器上的 Git - 智慧 HTTP

智慧 HTTP

我們現在已經透過 SSH 實現了認證訪問,並透過 git:// 實現了非認證訪問,但還有一種協議可以同時實現這兩種訪問。設定智慧 HTTP 基本上就是啟用 Git 提供的一個 CGI 指令碼,名為 git-http-backend,在伺服器上。這個 CGI 會讀取 git fetchgit push 到 HTTP URL 時傳送的路徑和頭部,並判斷客戶端是否可以透過 HTTP 進行通訊(自 1.6.6 版本以來,任何客戶端都支援)。如果 CGI 發現客戶端是智慧的,它將與客戶端進行智慧通訊;否則它將回退到非智慧行為(因此對於舊客戶端的讀取是向後相容的)。

讓我們來看一個非常基本的設定。我們將使用 Apache 作為 CGI 伺服器。如果你沒有設定 Apache,可以在 Linux 系統上像這樣操作

$ sudo apt-get install apache2 apache2-utils
$ a2enmod cgi alias env

這還會啟用 mod_cgimod_aliasmod_env 模組,這些模組都是使其正常工作所必需的。

你還需要將 /srv/git 目錄的 Unix 使用者組設定為 www-data,這樣你的 Web 伺服器才能擁有倉庫的讀寫許可權,因為執行 CGI 指令碼的 Apache 例項(預設情況下)將以此使用者執行

$ chgrp -R www-data /srv/git

接下來,我們需要在 Apache 配置中新增一些內容,以便將 git-http-backend 作為 Web 伺服器 /git 路徑下所有請求的處理程式來執行。

SetEnv GIT_PROJECT_ROOT /srv/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/

如果你省略 GIT_HTTP_EXPORT_ALL 環境變數,那麼 Git 將只向未經認證的客戶端提供包含 git-daemon-export-ok 檔案的倉庫,就像 Git daemon 所做的那樣。

最後,你需要告訴 Apache 允許對 git-http-backend 的請求,並透過某種方式進行寫入認證,例如使用如下的 Auth 塊

<Files "git-http-backend">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /srv/git/.htpasswd
    Require expr !(%{QUERY_STRING} -strmatch '*service=git-receive-pack*' || %{REQUEST_URI} =~ m#/git-receive-pack$#)
    Require valid-user
</Files>

這將要求你建立一個包含所有有效使用者密碼的 .htpasswd 檔案。以下是向檔案中新增“schacon”使用者的示例

$ htpasswd -c /srv/git/.htpasswd schacon

Apache 有多種使用者認證方式,你必須選擇並實現其中一種。這只是我們能想到的最簡單的例子。你幾乎肯定會希望透過 SSL 設定此功能,以便所有資料都被加密。

我們不想過多深入 Apache 配置的細節,因為你可能使用不同的伺服器或有不同的認證需求。核心思想是 Git 帶有一個名為 git-http-backend 的 CGI,它在被呼叫時會執行所有協商,透過 HTTP 傳送和接收資料。它本身不實現任何認證,但這可以透過呼叫它的 Web 伺服器層輕鬆控制。你幾乎可以使用任何支援 CGI 的 Web 伺服器來完成此操作,所以請選擇你最熟悉的一個。

注意

有關 Apache 中配置認證的更多資訊,請檢視 Apache 文件:https://httpd.apache.org/docs/current/howto/auth.html

scroll-to-top