Русский ▾ Topics ▾ Latest version ▾ git-daemon last updated in 2.50.0

НАЗВАНИЕ

git-daemon — Очень простой сервер для репозиториев Git

ОБЗОР

git daemon [--verbose] [--syslog] [--export-all]
	   [--timeout=<число>] [--init-timeout=<число>] [--max-connections=<число>]
	   [--strict-paths] [--base-path=<путь>] [--base-path-relaxed]
	   [--user-path | --user-path=<путь>]
	   [--interpolated-path=<шаблон-пути>]
	   [--reuseaddr] [--detach] [--pid-file=<файл>]
	   [--enable=<служба>] [--disable=<служба>]
	   [--allow-override=<служба>] [--forbid-override=<служба>]
	   [--access-hook=<путь>] [--[no-]informative-errors]
	   [--inetd |
	     [--listen=<хост-или-ip-адрес>] [--port=<число>]
	     [--user=<пользователь> [--group=<группа>]]]
	   [--log-destination=(stderr|syslog|none)]
	   [<каталог>…​]

ОПИСАНИЕ

Очень простой TCP-демон Git, который обычно прослушивает порт "DEFAULT_GIT_PORT" (он же 9418). Он ожидает соединения с запросом на службу и предоставляет эту службу, если она включена.

Он проверяет, есть ли в каталоге магический файл "git-daemon-export-ok", и отказывается экспортировать любой Git-каталог, который не был явно помечен для экспорта таким образом (если не указан параметр --export-all). Если вы передаёте некоторые пути каталогов в качестве аргументов git daemon, предложения ограничиваются репозиториями в этих каталогах.

По умолчанию включена только служба upload-pack, которая обслуживает клиентов git fetch-pack и git ls-remote, вызываемых из git fetch, git pull и git clone.

Это идеально подходит для обновлений только для чтения, т.е. получения из репозиториев Git.

Также существует upload-archive для обслуживания git archive.

ПАРАМЕТРЫ

--strict-paths

Сопоставлять пути точно (т.е. не разрешать "/foo/repo", когда реальный путь — "/foo/repo.git" или "/foo/repo/.git") и не использовать пути относительно пользователя. git daemon откажется запускаться, когда этот параметр включён и не указаны аргументы каталогов.

--base-path=<путь>

Переопределяет все запросы путей как относительные к указанному пути. Это своего рода "корень Git" — если вы запустите git daemon с --base-path=/srv/git на example.com, то если позже вы попытаетесь получить данные из git://example.com/hello.git, git daemon интерпретирует путь как /srv/git/hello.git.

--base-path-relaxed

Если --base-path включён и поиск репозитория не удаётся, с этим параметром git daemon попытается выполнить поиск без добавления базового пути. Это полезно для перехода к использованию --base-path, всё ещё разрешая старые пути.

--interpolated-path=<шаблон-пути>

Для поддержки виртуального хостинга можно использовать шаблон интерполированного пути для динамического создания альтернативных путей. Шаблон поддерживает %H для имени целевого хоста, предоставленного клиентом, но преобразованного в нижний регистр, %CH для канонического имени хоста, %IP для IP-адреса сервера, %P для номера порта и %D для абсолютного пути именованного репозитория. После интерполяции путь проверяется по списку каталогов.

--export-all

Разрешить получение из всех каталогов, которые выглядят как репозитории Git (имеют подкаталоги objects и refs), даже если в них нет файла git-daemon-export-ok.

--inetd

Запустить сервер как службу inetd. Подразумевает --syslog (может быть переопределено с помощью --log-destination=). Несовместимо с параметрами --detach, --port, --listen, --user и --group.

--listen=<хост-или-ip-адрес>

Прослушивать определённый IP-адрес или имя хоста. IP-адреса могут быть либо адресом IPv4, либо адресом IPv6, если поддерживается. Если IPv6 не поддерживается, то --listen=<имя-хоста> также не поддерживается, и --listen должен быть задан IPv4-адрес. Может быть указан несколько раз. Несовместимо с параметром --inetd.

--port=<n>

Прослушивать альтернативный порт. Несовместимо с параметром --inetd.

--init-timeout=<n>

Тайм-аут (в секундах) между моментом установления соединения и получением запроса клиента (обычно довольно низкое значение, поскольку это должно происходить практически мгновенно).

--timeout=<n>

Тайм-аут (в секундах) для конкретных клиентских подзапросов. Это включает время, необходимое серверу для обработки подзапроса, и время ожидания следующего запроса клиента.

--max-connections=<n>

Максимальное количество одновременных клиентов, по умолчанию 32. Установите ноль для отсутствия ограничения.

--syslog

Краткая форма для --log-destination=syslog.

--log-destination=<назначение>

Отправлять сообщения журнала в указанное место назначения. Обратите внимание, что этот параметр не подразумевает --verbose, поэтому по умолчанию будут регистрироваться только ошибочные ситуации. <назначение> должно быть одним из:

stderr

Записывать в стандартный вывод ошибок. Обратите внимание, что если указан --detach, процесс отключается от реального стандартного вывода ошибок, делая это место назначения фактически эквивалентным none.

syslog

Записывать в syslog, используя идентификатор git-daemon.

none

Отключить все журналирование.

Назначение по умолчанию — syslog, если указан --inetd или --detach, в противном случае — stderr.

--user-path
--user-path=<путь>

Разрешить использование обозначения ~пользователь в запросах. Если указано без параметра, запрос к git://host/~alice/foo рассматривается как запрос на доступ к репозиторию foo в домашнем каталоге пользователя alice. Если указан --user-path=<путь>, тот же запрос рассматривается как запрос на доступ к репозиторию <путь>/foo в домашнем каталоге пользователя alice.

--verbose

Регистрировать подробную информацию о входящих соединениях и запрошенных файлах.

--reuseaddr

Использовать SO_REUSEADDR при привязке прослушивающего сокета. Это позволяет серверу перезапускаться без ожидания тайм-аута старых соединений.

--detach

Отсоединиться от оболочки. Подразумевает --syslog.

--pid-file=<файл>

Сохранить идентификатор процесса в <файле>. Игнорируется, когда демон запущен под --inetd.

--user=<пользователь>
--group=<группа>

Изменить uid и gid демона перед входом в цикл обслуживания. Если указан только --user без --group, используется основной идентификатор группы для пользователя. Значения параметра передаются в getpwnam(3) и getgrnam(3), числовые идентификаторы не поддерживаются.

Указание этих параметров при использовании с --inetd является ошибкой; при необходимости используйте возможность демона inet для достижения того же результата перед запуском git daemon.

Как и многие программы, которые переключают идентификатор пользователя, демон не сбрасывает переменные среды, такие как HOME, когда запускает программы git, например upload-pack и receive-pack. При использовании этого параметра вам также может потребоваться установить и экспортировать HOME, чтобы он указывал на домашний каталог <пользователя> перед запуском демона, и убедиться, что любые файлы конфигурации Git в этом каталоге доступны для чтения <пользователем>.

--enable=<служба>
--disable=<служба>

Включить/отключить службу общесистемно по умолчанию. Обратите внимание, что служба, отключённая общесистемно, всё равно может быть включена для отдельного репозитория, если она помечена как переопределяемая и репозиторий включает службу с помощью элемента конфигурации.

--allow-override=<служба>
--forbid-override=<служба>

Разрешить/запретить переопределение общесистемного значения по умолчанию конфигурацией отдельного репозитория. По умолчанию все службы могут быть переопределены.

--informative-errors
--no-informative-errors

Когда включены информативные ошибки, git-daemon будет сообщать клиенту более подробные ошибки, отличая такие ситуации, как "нет такого репозитория" от "репозиторий не экспортирован". Это более удобно для клиентов, но может раскрыть информацию о существовании неэкспортированных репозиториев. Когда информативные ошибки не включены, все ошибки сообщают клиенту "отказано в доступе". По умолчанию используется --no-informative-errors.

--access-hook=<путь>

Каждый раз, когда клиент подключается, сначала выполняется внешняя команда, указанная <путём>, с именем службы (например, "upload-pack"), путём к репозиторию, именем хоста (%H), каноническим именем хоста (%CH), IP-адресом (%IP) и TCP-портом (%P) в качестве аргументов командной строки. Внешняя команда может решить отказать в обслуживании, завершившись с ненулевым статусом (или разрешить его, завершившись с нулевым статусом). Она также может просматривать переменные среды $REMOTE_ADDR и $REMOTE_PORT, чтобы узнать о запрашивающей стороне при принятии этого решения.

Внешняя команда может опционально записать одну строку в свой стандартный вывод, чтобы отправить её запрашивающей стороне в качестве сообщения об ошибке, когда она отказывает в обслуживании.

<каталог>

Оставшиеся аргументы предоставляют список каталогов. Если указаны какие-либо каталоги, то процесс git-daemon будет обслуживать запрошенный каталог, только если он содержится в одном из этих каталогов. Если указан --strict-paths, то запрошенный каталог должен точно соответствовать одному из этих каталогов.

СЛУЖБЫ

Эти службы могут быть глобально включены/отключены с помощью параметров командной строки этой команды. Если требуется более детальный контроль (например, разрешить выполнение git archive только в нескольких выбранных репозиториях, которые обслуживает демон), можно использовать файл конфигурации для каждого репозитория, чтобы включить или отключить их.

upload-pack

Это обслуживает клиентов git fetch-pack и git ls-remote. Он включён по умолчанию, но репозиторий может отключить его, установив элемент конфигурации daemon.uploadpack в false.

upload-archive

Это обслуживает git archive --remote. Он отключён по умолчанию, но репозиторий может включить его, установив элемент конфигурации daemon.uploadarch в true.

receive-pack

Это обслуживает клиентов git send-pack, разрешая анонимную отправку. Он отключён по умолчанию, поскольку в протоколе нет аутентификации (другими словами, любой может отправить что угодно в репозиторий, включая удаление ссылок). Это предназначено исключительно для закрытой локальной сети, где все дружественны. Эта служба может быть включена путём установки элемента конфигурации daemon.receivepack в true.

ПРИМЕРЫ

Мы предполагаем следующее в /etc/services
$ grep 9418 /etc/services
git		9418/tcp		# Git Version Control System
git daemon как сервер inetd

Чтобы настроить git daemon как службу inetd, которая обслуживает любой репозиторий в /pub/foo или /pub/bar, поместите запись, подобную следующей, в /etc/inetd всю на одной строке:

	git stream tcp nowait nobody  /usr/bin/git
		git daemon --inetd --verbose --export-all
		/pub/foo /pub/bar
git daemon как сервер inetd для виртуальных хостов

Чтобы настроить git daemon как службу inetd, которая обслуживает репозитории для разных виртуальных хостов, www.example.com и www.example.org, поместите запись, подобную следующей, в /etc/inetd всю на одной строке:

	git stream tcp nowait nobody /usr/bin/git
		git daemon --inetd --verbose --export-all
		--interpolated-path=/pub/%H%D
		/pub/www.example.org/software
		/pub/www.example.com/software
		/software

В этом примере корневой каталог /pub будет содержать подкаталог для каждого поддерживаемого имени виртуального хоста. Кроме того, оба хоста рекламируют репозитории просто как git://www.example.com/software/repo.git. Для клиентов до версии 1.4.0 также может быть создана символьная ссылка из /software в соответствующий репозиторий по умолчанию.

git daemon как обычный демон для виртуальных хостов

Чтобы настроить git daemon как обычную службу, отличную от inetd, которая обслуживает репозитории для нескольких виртуальных хостов на основе их IP-адресов, запустите демон следующим образом:

	git daemon --verbose --export-all
		--interpolated-path=/pub/%IP/%D
		/pub/192.168.1.200/software
		/pub/10.10.220.23/software

В этом примере корневой каталог /pub будет содержать подкаталог для каждого поддерживаемого IP-адреса виртуального хоста. Однако к репозиториям по-прежнему можно обращаться по имени хоста, предполагая, что они соответствуют этим IP-адресам.

выборочное включение/отключение служб для каждого репозитория

Чтобы включить git archive --remote и отключить git fetch для репозитория, поместите следующее в файл конфигурации в репозитории (то есть файл config рядом с HEAD, refs и objects).

	[daemon]
		uploadpack = false
		uploadarch = true

ОКРУЖЕНИЕ

git daemon установит REMOTE_ADDR в IP-адрес клиента, который подключился к нему, если IP-адрес доступен. REMOTE_ADDR будет доступен в среде перехватчиков, вызываемых при выполнении служб.

GIT

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