設定與配置
取得與建立專案
基本快照
分支與合併
分享與更新專案
檢視與比較
修補
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.43.1 → 2.47.0 無變更
-
2.43.0
11/20/23
- 2.34.1 → 2.42.3 無變更
-
2.34.0
11/15/21
- 2.22.1 → 2.33.8 無變更
-
2.22.0
06/07/19
- 2.10.5 → 2.21.4 無變更
-
2.9.5
07/30/17
- 2.5.6 → 2.8.6 無變更
-
2.4.12
05/05/17
- 2.1.4 → 2.3.10 無變更
-
2.0.5
12/17/14
描述
一個簡單的 CGI 程式,用於將 Git 儲存庫的內容提供給透過 http:// 和 https:// 協定存取儲存庫的 Git 客戶端。該程式支援使用智慧型 HTTP 協定和向後相容的啞型 HTTP 協定進行提取的客戶端,以及使用智慧型 HTTP 協定進行推送的客戶端。如果配置正確,它也支援 Git 更有效率的 "v2" 協定;請參閱下方環境章節中關於 GIT_PROTOCOL
的討論。
它會驗證目錄中是否存在魔法檔案 "git-daemon-export-ok",並且它會拒絕匯出任何未明確標記為以這種方式匯出的 Git 目錄(除非設定了 GIT_HTTP_EXPORT_ALL
環境變數)。
預設情況下,只啟用 upload-pack
服務,該服務為 git fetch-pack 和 git ls-remote 客戶端提供服務,這些客戶端從 git fetch、git pull 和 git clone 呼叫。如果客戶端已驗證身分,則會啟用 receive-pack
服務,該服務為 git send-pack 客戶端提供服務,該客戶端從 git push 呼叫。
服務
可以使用每個儲存庫的設定檔來啟用/停用這些服務
- http.getanyfile
-
此服務適用於 1.6.6 版之前的 Git 客戶端,這些客戶端無法使用 upload pack 服務。啟用後,客戶端可以讀取儲存庫中的任何檔案,包括不再從分支存取但仍然存在的物件。預設情況下啟用此服務,但儲存庫可以將此配置值設定為
false
來停用它。 - http.uploadpack
-
此服務為 git fetch-pack 和 git ls-remote 客戶端提供服務。預設情況下啟用此服務,但儲存庫可以將此配置值設定為
false
來停用它。 - http.receivepack
-
此服務為 git send-pack 客戶端提供服務,允許推送。預設情況下,對於匿名使用者停用,而對於透過 Web 伺服器驗證身分的使用者則預設啟用。可以將此項目設定為
false
來停用它,也可以將其設定為true
來為所有使用者(包括匿名使用者)啟用它。
URL 轉換
為了判斷磁碟上儲存庫的位置,git http-backend 會連接環境變數 PATH_INFO(由 Web 伺服器自動設定)和 GIT_PROJECT_ROOT(必須在 Web 伺服器配置中手動設定)。如果未設定 GIT_PROJECT_ROOT,git http-backend 會讀取 PATH_TRANSLATED,它也是由 Web 伺服器自動設定。
範例
以下所有範例都會將 http://$hostname/git/foo/bar.git
對應到 /var/www/git/foo/bar.git
。
- Apache 2.x
-
確保已啟用 mod_cgi、mod_alias 和 mod_env,適當地設定 GIT_PROJECT_ROOT(或 DocumentRoot),並建立指向 CGI 的 ScriptAlias
SetEnv GIT_PROJECT_ROOT /var/www/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ # This is not strictly necessary using Apache and a modern version of # git-http-backend, as the webserver will pass along the header in the # environment as HTTP_GIT_PROTOCOL, and http-backend will copy that into # GIT_PROTOCOL. But you may need this line (or something similar if you # are using a different webserver), or if you want to support older Git # versions that did not do that copying. # # Having the webserver set up GIT_PROTOCOL is perfectly fine even with # modern versions (and will take precedence over HTTP_GIT_PROTOCOL, # which means it can be used to override the client's request). SetEnvIf Git-Protocol ".*" GIT_PROTOCOL=$0
若要啟用匿名讀取存取權限,但啟用驗證的寫入存取權限,請對初始參考廣告(我們透過查詢字串中的 service 參數偵測到推送)以及 receive-pack 呼叫本身要求授權
RewriteCond %{QUERY_STRING} service=git-receive-pack [OR] RewriteCond %{REQUEST_URI} /git-receive-pack$ RewriteRule ^/git/ - [E=AUTHREQUIRED:yes] <LocationMatch "^/git/"> Order Deny,Allow Deny from env=AUTHREQUIRED AuthType Basic AuthName "Git Access" Require group committers Satisfy Any ... </LocationMatch>
如果您沒有
mod_rewrite
來比對查詢字串,則僅保護git-receive-pack
本身就足夠了,例如<LocationMatch "^/git/.*/git-receive-pack$"> AuthType Basic AuthName "Git Access" Require group committers ... </LocationMatch>
在此模式下,伺服器不會要求驗證,直到客戶端實際開始推送的物件協商階段,而不是在初始接觸期間。因此,您還必須在任何應接受推送的儲存庫中啟用
http.receivepack
配置選項。如果未設定http.receivepack
,則預設行為是拒絕任何未經驗證的使用者的推送;因此,初始請求會向客戶端回報403 Forbidden
,甚至沒有給予驗證的機會。若要對讀取和寫入都要求驗證,請在儲存庫或其父目錄之一周圍使用 Location 指令
<Location /git/private> AuthType Basic AuthName "Private Git Access" Require group committers ... </Location>
若要在相同 URL 上提供 gitweb,請使用 ScriptAliasMatch 來僅處理 git http-backend 可以處理的那些 URL,並將其餘的轉發到 gitweb
ScriptAliasMatch \ "(?x)^/git/(.*/(HEAD | \ info/refs | \ objects/(info/[^/]+ | \ [0-9a-f]{2}/[0-9a-f]{38} | \ pack/pack-[0-9a-f]{40}\.(pack|idx)) | \ git-(upload|receive)-pack))$" \ /usr/libexec/git-core/git-http-backend/$1 ScriptAlias /git/ /var/www/cgi-bin/gitweb.cgi/
若要從單一儲存庫中的不同 gitnamespaces[7] 提供多個儲存庫
SetEnvIf Request_URI "^/git/([^/]*)" GIT_NAMESPACE=$1 ScriptAliasMatch ^/git/[^/]*(.*) /usr/libexec/git-core/git-http-backend/storage.git$1
- 加速靜態 Apache 2.x
-
與上述類似,但 Apache 可以用來傳回磁碟上儲存的靜態檔案。在許多系統上,這可能更有效率,因為 Apache 可以要求核心將檔案內容直接從檔案系統複製到網路
SetEnv GIT_PROJECT_ROOT /var/www/git AliasMatch ^/git/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$ /var/www/git/$1 AliasMatch ^/git/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$ /var/www/git/$1 ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
這可以與 gitweb 配置結合使用
SetEnv GIT_PROJECT_ROOT /var/www/git AliasMatch ^/git/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$ /var/www/git/$1 AliasMatch ^/git/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$ /var/www/git/$1 ScriptAliasMatch \ "(?x)^/git/(.*/(HEAD | \ info/refs | \ objects/info/[^/]+ | \ git-(upload|receive)-pack))$" \ /usr/libexec/git-core/git-http-backend/$1 ScriptAlias /git/ /var/www/cgi-bin/gitweb.cgi/
- Lighttpd
-
確保已載入
mod_cgi
、mod_alias
、mod_auth
、mod_setenv
,然後適當地設定GIT_PROJECT_ROOT
,並將所有請求重新導向至 CGIalias.url += ( "/git" => "/usr/lib/git-core/git-http-backend" ) $HTTP["url"] =~ "^/git" { cgi.assign = ("" => "") setenv.add-environment = ( "GIT_PROJECT_ROOT" => "/var/www/git", "GIT_HTTP_EXPORT_ALL" => "" ) }
若要啟用匿名讀取存取權限,但啟用驗證的寫入存取權限
$HTTP["querystring"] =~ "service=git-receive-pack" { include "git-auth.conf" } $HTTP["url"] =~ "^/git/.*/git-receive-pack$" { include "git-auth.conf" }
其中
git-auth.conf
看起來類似auth.require = ( "/" => ( "method" => "basic", "realm" => "Git Access", "require" => "valid-user" ) ) # ...and set up auth.backend here
若要對讀取和寫入都要求驗證
$HTTP["url"] =~ "^/git/private" { include "git-auth.conf" }
環境
git http-backend 依賴於由呼叫 Web 伺服器設定的 CGI
環境變數,包括
-
PATH_INFO(如果已設定 GIT_PROJECT_ROOT,否則為 PATH_TRANSLATED)
-
REMOTE_USER
-
REMOTE_ADDR
-
CONTENT_TYPE
-
QUERY_STRING
-
REQUEST_METHOD
可以將 GIT_HTTP_EXPORT_ALL
環境變數傳遞給 git-http-backend,以繞過允許匯出每個儲存庫之前的 "git-daemon-export-ok" 檔案檢查。
可以設定 GIT_HTTP_MAX_REQUEST_BUFFER
環境變數(或 http.maxRequestBuffer
配置選項)來變更 Git 在提取期間處理的最大參考協商請求;任何需要更大緩衝區的提取都不會成功。此值通常不需要變更,但如果您要從具有極大量參考的儲存庫中提取,則可能會有所幫助。該值可以使用單位指定(例如,100M
表示 100 MB)。預設值為 10 MB。
客戶端可以使用 Git-Protocol
HTTP 標頭探測選用協定功能(例如 v2 協定)。為了支援這些功能,該標頭的內容必須出現在 GIT_PROTOCOL
環境變數中。大多數 Web 伺服器會透過 HTTP_GIT_PROTOCOL
變數將此標頭傳遞給 CGI,並且 git-http-backend
會自動將其複製到 GIT_PROTOCOL
。但是,某些 Web 伺服器可能會對它們將傳遞哪些標頭更具選擇性,在這種情況下,它們需要明確配置(請參閱前面範例章節中 Apache 配置中提及的 Git-Protocol
)。
後端程序會將 GIT_COMMITTER_NAME 設定為 $REMOTE_USER,並將 GIT_COMMITTER_EMAIL 設定為 ${REMOTE_USER}@http.${REMOTE_ADDR},確保由 git-receive-pack 建立的任何 reflog 都包含執行推送的遠端使用者的一些識別資訊。
所有 CGI
環境變數都可用於由 git-receive-pack 呼叫的每個 Hook。
GIT
git[1] 套件的一部分