Skip to content

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_cgimod_aliasmod_authmod_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) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布