設定和配置
獲取和建立專案
基本快照
分支與合併
共享和更新專案
檢查和比較
打補丁
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.49.1 → 2.52.0 無更改
-
2.49.0
2025-03-14
- 2.43.1 → 2.48.2 無變更
-
2.43.0
2023-11-20
- 2.34.1 → 2.42.4 無更改
-
2.34.0
2021-11-15
- 2.22.1 → 2.33.8 無更改
-
2.22.0
2019-06-07
- 2.10.5 → 2.21.4 無更改
-
2.9.5
2017-07-30
- 2.5.6 → 2.8.6 無更改
-
2.4.12
2017-05-05
- 2.1.4 → 2.3.10 無更改
-
2.0.5
2014-12-17
描述
一個簡單的 CGI 程式,用於透過 http:// 和 https:// 協議為訪問 Git 倉庫的 Git 客戶端提供 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 且無法使用 upload pack 服務的 Git 客戶端。啟用後,客戶端可以讀取倉庫中的任何檔案,包括尚未從分支訪問但仍然存在的物件。此服務預設啟用,但倉庫可以透過將此配置值設定為
false來停用它。 - http.uploadpack
-
此服務為 git fetch-pack 和 git ls-remote 客戶端提供服務。此服務預設啟用,但倉庫可以透過將此配置值設定為
false來停用它。 - http.receivepack
-
此服務為 git send-pack 客戶端提供服務,允許推送。預設情況下,它對匿名使用者停用,而對 Web 伺服器認證的使用者預設啟用。可以透過將此項設定為
false來停用它,或者透過將其設定為true來為包括匿名使用者在內的所有使用者啟用它。 - http.uploadarchive
-
此服務為 git archive 客戶端提供透過 HTTP/HTTPS 協議進行遠端歸檔的服務。此服務預設停用。它僅在協議 v2 中工作。
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),並建立 ScriptAlias 指向 CGI。
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
要啟用匿名讀取訪問但經過身份驗證的寫入訪問,請要求對初始 ref 廣告(我們透過查詢字串中的 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,則拒絕未經身份驗證的使用者的任何推送;因此,初始請求將向客戶端報告403Forbidden,甚至不提供身份驗證的機會。要要求對讀取和寫入都進行身份驗證,請在倉庫或其父目錄周圍使用 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,並將所有請求重定向到 CGI。
alias.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-backend 傳遞 GIT_HTTP_EXPORT_ALL 環境變數,以繞過在允許匯出每個倉庫之前檢查該倉庫中的“git-daemon-export-ok”檔案。
可以設定 GIT_HTTP_MAX_REQUEST_BUFFER 環境變數(或 http.maxRequestBuffer 配置選項)來更改 git 在獲取期間將處理的最大 ref 協商請求;任何需要更大緩衝區的獲取都將失敗。此值通常不需要更改,但如果您正在從具有大量 ref 的倉庫進行獲取,則可能有助於解決問題。可以使用單位指定值(例如,100M 表示 100 兆位元組)。預設值為 10 兆位元組。
客戶端可以使用 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 呼叫到的每個鉤子。