设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
-
2.49.0
2025-03-14
- 2.43.1 → 2.48.1 没有更改
-
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 程序,用于将 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 且无法使用 upload pack 服务的 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/ # 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 广告(我们将其检测为通过查询字符串中的服务参数进行推送)和 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 在获取期间将处理的最大 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* 调用的每个钩子。
GIT
git[1] 套件的一部分