Русский ▾ Topics ▾ Latest version ▾ git-http-backend last updated in 2.49.0

НАЗВАНИЕ

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. По умолчанию отключено. Работает только в протоколе v2.

ПРЕОБРАЗОВАНИЕ URL

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

ПРИМЕРЫ

Все следующие примеры сопоставляют http://$имя_хоста/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/

# Это не строго необходимо при использовании Apache и современной версии
# git-http-backend, так как веб-сервер передаст заголовок в
# среде как HTTP_GIT_PROTOCOL, и http-backend скопирует его в
# GIT_PROTOCOL. Но вам может понадобиться эта строка (или что-то подобное,
# если вы используете другой веб-сервер) или если вы хотите поддерживать
# старые версии Git, которые не выполняли такое копирование.
#
# Настройка GIT_PROTOCOL веб-сервером вполне допустима даже с
# современными версиями (и будет иметь приоритет над HTTP_GIT_PROTOCOL,
# что означает, что её можно использовать для переопределения запроса клиента).
SetEnvIf Git-Protocol ".*" GIT_PROTOCOL=$0

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

Чтобы требовать аутентификацию как для чтения, так и для записи:

$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 из предыдущего раздела ПРИМЕРЫ).

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

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

GIT

Является частью пакета git[1]