Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
- 2.49.1 → 2.54.0 no changes
-
2.49.0
2025-03-14
- 2.43.1 → 2.48.2 no changes
-
2.43.0
2023-11-20
- 2.34.1 → 2.42.4 no changes
-
2.34.0
2021-11-15
- 2.22.1 → 2.33.8 no changes
-
2.22.0
2019-06-07
- 2.10.5 → 2.21.4 no changes
-
2.9.5
2017-07-30
- 2.5.6 → 2.8.6 no changes
-
2.4.12
2017-05-05
- 2.1.4 → 2.3.10 no changes
-
2.0.5
2014-12-17
ОПИСАНИЕ
Простая программа 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не установлен, — отклонять любые отправки неаутентифицированными пользователями; поэтому начальный запрос сообщит клиенту403Forbidden, даже не предоставляя возможности для аутентификации.Чтобы требовать аутентификацию как для чтения, так и для записи, используйте директиву 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]