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.51.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 клієнтам, які отримують доступ до репозиторію через протоколи 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]