?
This document uses PHP Chinese website manual Release
git-http-backend - Git 在HTTP的服務(wù)器端實現(xiàn)
git http-backend
一個簡單的 CGI 程序,用于向通過 http://和https://協(xié)議訪問存儲庫的 Git 客戶端提供 Git 存儲庫的內(nèi)容。該程序支持客戶端使用智能 HTTP 協(xié)議和向后兼容的愚蠢 HTTP 協(xié)議以及客戶端使用智能 HTTP 協(xié)議進(jìn)行推送。
它會驗證該目錄是否具有魔術(shù)文件“git-daemon-export-ok”,并且它會拒絕導(dǎo)出任何未明確標(biāo)記為導(dǎo)出的 Git 目錄(除非GIT_HTTP_EXPORT_ALL
設(shè)置了環(huán)境變量)。
默認(rèn)情況下,只有upload-pack
服務(wù)已啟用,供應(yīng)git fetch-pack
和git ls-remote
客戶,這是從調(diào)用git fetch
,git pull
和git clone
。如果客戶端已通過身份驗證,receive-pack
則會啟用該服務(wù),該服務(wù)將為git send-pack
客戶端提供服務(wù),并從中調(diào)用該服務(wù)git push
。
可以使用每個存儲庫配置文件啟用/禁用這些服務(wù):
http.getanyfile
這為不能使用上傳包服務(wù)的版本低于1.6.6的 Git 客戶端提供服務(wù)。啟用時,客戶端可以讀取存儲庫中的任何文件,包括不再從分支中訪問但仍存在的對象。它是默認(rèn)啟用的,但是一個存儲庫可以通過設(shè)置這個配置項來禁用它false
。
http.uploadpack
這服務(wù)git fetch-pack
和git ls-remote
客戶。它是默認(rèn)啟用的,但是一個存儲庫可以通過設(shè)置這個配置項來禁用它false
。
http.receivepack
這為git send-pack
客戶提供服務(wù),從而推動。默認(rèn)情況下,它對于匿名用戶是禁用的,并且默認(rèn)情況下為 Web 服務(wù)器驗證的用戶啟用??梢酝ㄟ^將該項目設(shè)置為false
或禁用所有用戶(包括匿名用戶),將其設(shè)置為true
。
要確定存儲庫在磁盤上的位置,需要git http-backend
連接由 Web 服務(wù)器自動設(shè)置的環(huán)境變量 PATH_INFO 和必須在 Web 服務(wù)器配置中手動設(shè)置的 GIT_PROJECT_ROOT。如果未設(shè)置 GIT_PROJECT_ROOT,則git http-backend
讀取 PATH_TRANSLATED,它也由 Web 服務(wù)器自動設(shè)置。
以下所有示例都映射http://$hostname/git/foo/bar.git
到/var/www/git/foo/bar.git
。
Apache 2.x
確保已啟用mod_cgi,mod_alias 和 mod_env,并正確設(shè)置 GIT_PROJECT_ROOT(或DocumentRoot),并為 CGI 創(chuàng)建一個 ScriptAlias:
SetEnv GIT_PROJECT_ROOT /var/www/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
要啟用匿名讀取訪問但授權(quán)寫入訪問,需要授權(quán)初始引用廣告(我們通過查詢字符串中的服務(wù)參數(shù)檢測為推送)以及接收包調(diào)用本身:
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
可用于匹配查詢字符串,則僅保護(hù)git-receive-pack
自己就足夠了,如:
<LocationMatch "^/git/.*/git-receive-pack$"> AuthType Basic AuthName "Git Access" Require group committers ...</LocationMatch>
在這種模式下,服務(wù)器將不會請求認(rèn)證,直到客戶端實際啟動推送的對象協(xié)商階段,而不是在初始聯(lián)系期間。出于這個原因,您還必須http.receivepack
在任何應(yīng)該接受推送的存儲庫中啟用配置選項。默認(rèn)行為如果http.receivepack
未設(shè)置,則拒絕未經(jīng)身份驗證的用戶進(jìn)行的任何推送; 因此最初的請求會403 Forbidden
向客戶報告,甚至沒有提供認(rèn)證的機(jī)會。
要對讀取和寫入進(jìn)行身份驗證,請在存儲庫或其父目錄之一使用 Location 指令:
<Location /git/private> AuthType Basic AuthName "Private Git Access" Require group committers ...</Location>
要在相同的 url 上提供 gitweb,請使用 ScriptAliasMatch 僅git http-backend
處理那些可以處理的 URL ,然后將其余的轉(zhuǎn)發(fā)到 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/$1ScriptAlias /git/ /var/www/cgi-bin/gitweb.cgi/
要在單個存儲庫中提供來自不同 gitnamespaces [7]的多個存儲庫:
SetEnvIf Request_URI "^/git/([^/]*)" GIT_NAMESPACE=$1ScriptAliasMatch ^/git/[^/]*(.*) /usr/libexec/git-core/git-http-backend/storage.git$1
Accelerated static Apache 2.x
與上面類似,但 Apache 可用于返回存儲在磁盤上的靜態(tài)文件。在許多系統(tǒng)上,這可能更有效,因為 Apache 可以要求內(nèi)核將文件內(nèi)容從文件系統(tǒng)直接復(fù)制到網(wǎng)絡(luò):
SetEnv GIT_PROJECT_ROOT /var/www/git AliasMatch ^/git/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$ /var/www/git/$1AliasMatch ^/git/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$ /var/www/git/$1ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
這可以與 gitweb 配置結(jié)合使用:
SetEnv GIT_PROJECT_ROOT /var/www/git AliasMatch ^/git/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$ /var/www/git/$1AliasMatch ^/git/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$ /var/www/git/$1ScriptAliasMatch \ "(?x)^/git/(.*/(HEAD | \ info/refs | \ objects/info/[^/]+ | \ git-(upload|receive)-pack))$" \ /usr/libexec/git-core/git-http-backend/$1ScriptAlias /git/ /var/www/cgi-bin/gitweb.cgi/
Lighttpd
確保mod_cgi
,mod_alias
,mod_auth
,mod_setenv
加載,然后設(shè)置GIT_PROJECT_ROOT
適當(dāng)?shù)暮椭囟ㄏ虻?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
依賴于CGI
調(diào)用 Web 服務(wù)器設(shè)置的環(huán)境變量,包括:
PATH_INFO (if GIT_PROJECT_ROOT is set, otherwise PATH_TRANSLATED)
REMOTE_USER
REMOTE_ADDR
CONTENT_TYPE
QUERY_STRING
REQUEST_METHOD
在允許導(dǎo)出該存儲庫之前,可以將GIT_HTTP_EXPORT_ALL
環(huán)境變量傳遞給git-http-backend
繞過每個存儲庫中“git-daemon-export-ok”文件的檢查。
GIT_HTTP_MAX_REQUEST_BUFFER
環(huán)境變量(或http.maxRequestBuffer
配置變量)可以被設(shè)置為改變最大 REF 協(xié)商請求中取回 git 會處理; 任何需要較大緩沖區(qū)的獲取都不會成功。通常不需要更改此值,但是如果從具有極大數(shù)量的引用的存儲庫中提取,可能會有所幫助。該值可以用單位指定(例如,100M
代表100兆字節(jié))。默認(rèn)值是10兆字節(jié)。
后端進(jìn)程將 GIT_COMMITTER_NAME 設(shè)置為,$REMOTE_USER
和將GIT_COMMITTER_EMAIL 設(shè)置為,以${REMOTE_USER}@http.${REMOTE_ADDR}
確保git-receive-pack
創(chuàng)建的任何reflog 包含執(zhí)行推送的遠(yuǎn)程用戶的一些標(biāo)識信息。
所有的CGI
環(huán)境變量都可用于每個被git-receive-pack
調(diào)用的鉤子。