git-http-backend
Git over HTTP 的服务器端实现
概要
'git http-backend'描述
一个简单的 CGI 程序,用于通过 http:// 和 https:// 协议向访问仓库的 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- 为无法使用 upload pack 服务的 1.6.6 之前的 Git 客户端提供服务。启用后,客户端可以读取仓库中的任何文件,包括不再从分支可达但仍存在的对象。默认启用,但仓库可以通过将此配置值设置为false来禁用它。http.uploadpack- 为 'git fetch-pack' 和 'git ls-remote' 客户端提供服务。默认启用,但仓库可以通过将此配置值设置为false来禁用它。http.receivepack- 为 'git send-pack' 客户端提供服务,允许推送。默认对匿名用户禁用,对 Web 服务器认证的用户启用。可以通过将此项设置为false来禁用,或通过设置为true为所有用户(包括匿名用户)启用。http.uploadarchive- 为通过 HTTP/HTTPS 协议进行远程存档的 'git archive' 客户端提供服务。默认禁用。仅在协议 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),并创建到 CGI 的 ScriptAlias:
SetEnv GIT_PROJECT_ROOT /var/www/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/要启用匿名读取访问但认证的写入访问,对初始引用公告(我们通过查询字符串中的服务参数检测为推送)和 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>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" => ""
)
}环境
'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 在获取期间处理的最大引用协商请求;任何需要更大缓冲区的获取都不会成功。
客户端可以使用 Git-Protocol HTTP 头探测可选的协议能力(如 v2 协议)。为了支持这些,该头的内容必须出现在 GIT_PROTOCOL 环境变量中。大多数 Web 服务器将通过 HTTP_GIT_PROTOCOL 变量将此头传递给 CGI,git-http-backend 将自动将其复制到 GIT_PROTOCOL。
后端进程将 GIT_COMMITTER_NAME 设置为 '$REMOTE_USER',将 GIT_COMMITTER_EMAIL 设置为 '${REMOTE_USER}@http.${REMOTE_ADDR}',确保 'git-receive-pack' 创建的任何 reflog 包含执行推送的远程用户的一些标识信息。
所有 CGI 环境变量对 'git-receive-pack' 调用的每个钩子都可用。
Git
git(1) 套件的一部分
