українська мова ▾ 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 на /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}, гарантуючи, що будь-які reflogs, створені git-receive-pack, містять певну ідентифікаційну інформацію віддаленого користувача, який виконав надсилання.

Усі змінні середовища CGI доступні для кожного з гачків, викликаних git-receive-pack.

GIT

Частина набору git[1]