direktori cari
Guides gitattributes giteveryday gitglossary gitignore gitmodules gitrevisions gittutorial gitworkflows Administration git archive git bundle git clean git filter-branch git fsck git gc git instaweb git reflog Basic Snapshotting git add git commit git diff git mv git reset git rm git status Branching and Merging git branch git checkout git log git merge git mergetool git stash git tag Debugging git bisect git blame git grep Email git am git format-patch git request-pull git send-email External Systems git fast-import git svn Getting and Creating Projects git clone git init Git git annotate git archimport git bisect-lk2009 git check-attr git check-mailmap git check-ref-format git checkout-index git cherry git citool git column git credential git credential-cache git credential-store git cvsexportcommit git cvsimport git cvsserver git diff-files git diff-tree git difftool git fast-export git fetch-pack git fmt-merge-msg git get-tar-commit-id git gui git http-backend git http-fetch git http-push git imap-send git index-pack git interpret-trailers git ls-remote git ls-tree git mailinfo git mailsplit git merge-file git merge-index git merge-one-file git merge-tree git mktag git mktree git name-rev git notes git p4 git pack-objects git pack-redundant git pack-refs git parse-remote git patch-id git prune git prune-packed git quiltimport git receive-pack git remote-ext git remote-fd git remote-testgit git repack git replace git rerere git send-pack git sh-i18n git sh-setup git shell git show-branch git show-index git stripspace git unpack-file git unpack-objects git upload-archive git upload-pack git var git verify-commit git verify-tag git whatchanged git worktree Inspection and Comparison git describe git shortlog git show Miscellaneous api credentials api index gitcli gitcore tutorial gitcredentials gitcvs migration gitdiffcore githooks gitk gitnamespaces gitremote helpers gitrepository layout gitsubmodules gittutorial 2 gitweb gitweb.conf pack format User Manual Patching git apply git cherry-pick git rebase git revert Plumbing Commands git cat-file git check-ignore git commit-tree git count-objects git diff-index git for-each-ref git hash-object git ls-files git merge-base git read-tree git rev-list git rev-parse git show-ref git symbolic-ref git update-index git update-ref git verify-pack git write-tree Server Admin git daemon git update-server-info Setup and Config git git config git help Sharing and Updating Projects git fetch git pull git push git remote git submodule
watak

名称

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

概要

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:

SetEnv GIT_PROJECT_ROOT /var/www/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/

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

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/$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 可用于返回存储在磁盘上的静态文件。在许多系统上,这可能更有效,因为 Apache 可以要求内核将文件内容从文件系统直接复制到网络:

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 配置结合使用:

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_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" => ""        )}

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

$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调用 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调用的钩子。

Artikel sebelumnya: Artikel seterusnya: