章節 ▾ 第二版

4.6 Git on the Server - Smart HTTP

Smart HTTP

我們現在可以透過 SSH 進行認證訪問,並透過 git:// 進行非認證訪問,但還有一種協議可以同時完成這兩件事。設定 Smart HTTP 基本上就是啟用 Git 自帶的一個名為 git-http-backend 的 CGI 指令碼。這個 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