首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

git http-backend

名称

git-http-backend - Git 在HTTP的服务器端实现

概要

代码语言:javascript
复制
git http-backend

描述

一个简单的 CGI 程序,用于向通过 http://和https://协议访问存储库的 Git 客户端提供 Git 存储库的内容。该程序支持客户端使用智能 HTTP 协议和向后兼容的愚蠢 HTTP 协议以及客户端使用智能 HTTP 协议进行推送。

它会验证该目录是否具有魔术文件“git-daemon-export-ok”,并且它会拒绝导出任何未明确标记为导出的 Git 目录(除非GIT_HTTP_EXPORT_ALL设置了环境变量)。

默认情况下,只有upload-pack服务已启用,供应git fetch-packgit ls-remote客户,这是从调用git fetchgit pullgit clone。如果客户端已通过身份验证,receive-pack则会启用该服务,该服务将为git send-pack客户端提供服务,并从中调用该服务git push

服务

可以使用每个存储库配置文件启用/禁用这些服务:

http.getanyfile

这为不能使用上传包服务的版本低于1.6.6的 Git 客户端提供服务。启用时,客户端可以读取存储库中的任何文件,包括不再从分支中访问但仍存在的对象。它是默认启用的,但是一个存储库可以通过设置这个配置项来禁用它false

http.uploadpack

这服务git fetch-packgit ls-remote客户。它是默认启用的,但是一个存储库可以通过设置这个配置项来禁用它false

http.receivepack

这为git send-pack客户提供服务,从而推动。默认情况下,它对于匿名用户是禁用的,并且默认情况下为 Web 服务器验证的用户启用。可以通过将该项目设置为false或禁用所有用户(包括匿名用户),将其设置为true

网址翻译

要确定存储库在磁盘上的位置,需要git http-backend连接由 Web 服务器自动设置的环境变量 PATH_INFO 和必须在 Web 服务器配置中手动设置的 GIT_PROJECT_ROOT。如果未设置 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:

代码语言:javascript
复制
SetEnv GIT_PROJECT_ROOT /var/www/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/

要启用匿名读取访问但授权写入访问,需要授权初始引用广告(我们通过查询字符串中的服务参数检测为推送)以及接收包调用本身:

代码语言:javascript
复制
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自己就足够了,如:

代码语言:javascript
复制
<LocationMatch "^/git/.*/git-receive-pack$">
        AuthType Basic
        AuthName "Git Access"
        Require group committers
        ...
</LocationMatch>

在这种模式下,服务器将不会请求认证,直到客户端实际启动推送的对象协商阶段,而不是在初始联系期间。出于这个原因,您还必须http.receivepack在任何应该接受推送的存储库中启用配置选项。默认行为如果http.receivepack未设置,则拒绝未经身份验证的用户进行的任何推送; 因此最初的请求会403 Forbidden向客户报告,甚至没有提供认证的机会。

要对读取和写入进行身份验证,请在存储库或其父目录之一使用 Location 指令:

代码语言:javascript
复制
<Location /git/private>
        AuthType Basic
        AuthName "Private Git Access"
        Require group committers
        ...
</Location>

要在相同的 url 上提供 gitweb,请使用 ScriptAliasMatch 仅git http-backend处理那些可以处理的 URL ,然后将其余的转发到 gitweb:

代码语言:javascript
复制
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]的多个存储库:

代码语言:javascript
复制
SetEnvIf Request_URI "^/git/([^/]*)" GIT_NAMESPACE=$1
ScriptAliasMatch ^/git/[^/]*(.*) /usr/libexec/git-core/git-http-backend/storage.git$1

Accelerated static Apache 2.x

与上面类似,但 Apache 可用于返回存储在磁盘上的静态文件。在许多系统上,这可能更有效,因为 Apache 可以要求内核将文件内容从文件系统直接复制到网络:

代码语言:javascript
复制
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 配置结合使用:

代码语言:javascript
复制
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_cgimod_aliasmod_authmod_setenv加载,然后设置GIT_PROJECT_ROOT适当的和重定向到 CGI 的所有请求:

代码语言:javascript
复制
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" => ""
        )
}

要启用匿名读取访问但验证写入访问:

代码语言:javascript
复制
$HTTP["querystring"] =~ "service=git-receive-pack" {
        include "git-auth.conf"
}
$HTTP["url"] =~ "^/git/.*/git-receive-pack$" {
        include "git-auth.conf"
}

git-auth.conf某些地方看起来类似:

代码语言:javascript
复制
auth.require = (
        "/" => (
                "method" => "basic",
                "realm" => "Git Access",
                "require" => "valid-user"
               )
)
# ...and set up auth.backend here

要求读取和写入验证:

代码语言:javascript
复制
$HTTP["url"] =~ "^/git/private" {
        include "git-auth.conf"
}

环境

git http-backend依赖于CGI调用 Web 服务器设置的环境变量,包括:

  • PATH_INFO (if GIT_PROJECT_ROOT is set, otherwise 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配置变量)可以被设置为改变最大 REF 协商请求中取回 git 会处理; 任何需要较大缓冲区的获取都不会成功。通常不需要更改此值,但是如果从具有极大数量的引用的存储库中提取,可能会有所帮助。该值可以用单位指定(例如,100M代表100兆字节)。默认值是10兆字节。

后端进程将 GIT_COMMITTER_NAME 设置为,$REMOTE_USER和将GIT_COMMITTER_EMAIL 设置为,以${REMOTE_USER}@http.${REMOTE_ADDR}确保git-receive-pack创建的任何reflog 包含执行推送的远程用户的一些标识信息。

所有的CGI环境变量都可用于每个被git-receive-pack调用的钩子。

扫码关注腾讯云开发者

领取腾讯云代金券