Spec-Zone.ru › Git

git-http-backend

Название

git-http-backend — серверная реализация Git поверх HTTP

Краткое описание

git http-backend

Описание

Простая программа CGI для предоставления содержимого репозитория Git клиентам Git, обращающимся к репозиторию по протоколам http:// и https://. Программа поддерживает клиентов, получающих данные с использованием как интеллектуального протокола 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

Эта служба обслуживает клиенты Git старше версии 1.6.6, которые не могут использовать службу upload pack. Если служба включена, клиенты могут читать любой файл в репозитории, включая объекты, которые больше недоступны из ветки, но всё ещё присутствуют. По умолчанию служба включена, но репозиторий может отключить её, задав для этого параметра конфигурации значение false.

http.uploadpack

Эта служба обслуживает клиентов git fetch-pack и git ls-remote. По умолчанию служба включена, но репозиторий может отключить её, задав для этого параметра конфигурации значение false.

http.receivepack

Эта служба обслуживает клиентов git send-pack, позволяя выполнять отправку изменений. По умолчанию она отключена для анонимных пользователей и включена для пользователей, прошедших аутентификацию на веб-сервере. Её можно отключить, задав для этого параметра значение false, либо включить для всех пользователей, в том числе анонимных, задав значение true.

http.uploadarchive

Эта служба обслуживает клиентов git archive для создания удалённого архива по протоколам HTTP/HTTPS. По умолчанию она отключена. Работает только с протоколом версии 2.

Преобразование URL

Чтобы определить расположение репозитория на диске, git http-backend объединяет переменные окружения PATH_INFO, автоматически заданную веб-сервером, и GIT_PROJECT_ROOT, которую необходимо задать вручную в конфигурации веб-сервера. Если GIT_PROJECT_ROOT не задана, git http-backend считывает PATH_TRANSLATED, также автоматически задаваемую веб-сервером.

Примеры

Во всех приведённых ниже примерах 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) и создайте ScriptAlias для CGI:

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

Чтобы разрешить анонимный доступ на чтение, но требовать аутентификацию для записи, включите авторизацию как для первоначального объявления ссылок (его мы распознаём как отправку изменений по параметру service в строке запроса), так и для самого вызова 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>

Чтобы обслуживать gitweb по тому же URL, используйте ScriptAliasMatch только для URL, которые может обрабатывать git http-backend, а остальные запросы перенаправляйте в 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 и перенаправьте все запросы в 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, заданные вызывающим веб-сервером, включая:

  • 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 будет обрабатывать при получении данных; получение данных, требующее большего буфера, завершится неудачей. Обычно это значение не нужно менять, но это может быть полезно при получении данных из репозитория с чрезвычайно большим количеством ссылок. Можно указать единицу измерения (например, 100M для 100 мегабайт). По умолчанию используется 10 мегабайт.

Клиенты могут проверять поддержку дополнительных возможностей протокола (например, протокола v2) с помощью HTTP-заголовка Git-Protocol. Чтобы поддержать такие возможности, содержимое этого заголовка должно быть доступно в переменной окружения GIT_PROTOCOL. Большинство веб-серверов передают этот заголовок CGI через переменную HTTP_GIT_PROTOCOL, а git-http-backend автоматически копирует её в GIT_PROTOCOL. Однако некоторые веб-серверы могут передавать только определённые заголовки; в таком случае их необходимо настроить явно (см. упоминание Git-Protocol в конфигурации Apache в разделе ПРИМЕРЫ выше).

Процесс backend задаёт для GIT_COMMITTER_NAME значение $REMOTE_USER, а для GIT_COMMITTER_EMAIL — ${REMOTE_USER}@http.${REMOTE_ADDR}, чтобы в любых reflog, созданных git-receive-pack, содержались сведения, позволяющие идентифицировать удалённого пользователя, выполнившего отправку изменений.

Все переменные окружения CGI доступны каждому хуку, запускаемому git-receive-pack.

http-backend

© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-http-backend

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API