українська мова ▾ Topics ▾ Latest version ▾ git-http-backend last updated in 2.49.0

НАЗВА

git-http-backend - Серверна реалізація Git через HTTP

СИНОПСИС

git http-backend

ОПИС

Проста CGI-програма для передачі вмісту репозиторію Git клієнтам, які отримують доступ до репозиторію через протоколи http:// та https://. Програма підтримує отримання даних клієнтами за допомогою як smart HTTP-протоколу, так і зворотно сумісного dumb HTTP-протоколу, а також відправку даних клієнтами за допомогою smart 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, які не можуть використовувати службу завантаження пакетів. Коли ця функція ввімкнена, клієнти можуть читати будь-який файл у репозиторії, включаючи об’єкти, які більше не доступні з гілки, але все ще присутні. Ця функція ввімкнена за замовчуванням, але репозиторій може вимкнути її, встановивши для цього значення конфігурації значення 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://$hostname/git/foo/bar.git to /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

Щоб увімкнути анонімний доступ для читання, але автентифікований доступ для запису, вимагайте авторизації як для початкового оголошення ref (яке ми виявляємо як push через параметр 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>

У цьому режимі сервер не запитуватиме автентифікацію, доки клієнт фактично не розпочне фазу узгодження об’єкта push-повідомлення, а не під час початкового контакту. З цієї причини ви також повинні ввімкнути опцію конфігурації http.receivepack у будь-яких репозиторіях, які повинні приймати push-повідомлення. Поведінка за замовчуванням, якщо http.receivepack не встановлено, полягає у відхиленні будь-яких push-повідомлень від неавтентифікованих користувачів; тому початковий запит повідомить клієнту 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-auth

НАВКОЛИШНЄ СЕРЕДОВИЩЕ

git http-backend спирається на змінні середовища CGI, встановлені веб-сервером, що викликає, включаючи:

  • PATH_INFO (if 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]