Git
章節 ▾ 第二版

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,以便您的網路伺服器可以讀寫存取儲存庫,因為執行 CGI 腳本的 Apache 實例(預設)將以該使用者身份執行

$ chgrp -R www-data /srv/git

接下來,我們需要在 Apache 設定中新增一些內容,以執行 git-http-backend 作為任何進入您網路伺服器 /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 一樣,對未驗證的客戶端提供含有 git-daemon-export-ok 檔案的儲存庫。

最後,您會希望告訴 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 發送和接收資料的協商。它本身不實作任何驗證,但這可以很容易地在調用它的網頁伺服器層級進行控制。您可以使用幾乎任何具有 CGI 功能的網頁伺服器來執行此操作,所以選擇您最熟悉的那個即可。

注意

有關在 Apache 中設定驗證的更多資訊,請查閱此處的 Apache 文件:https://apache-httpd.dev.org.tw/docs/current/howto/auth.html

scroll-to-top