Git
English ▾ 主题 ▾ 最新版本 ▾ git-daemon 最后更新于 2.44.0

名称

git-daemon - 一个非常简单的 Git 仓库服务器

概要

git daemon [--verbose] [--syslog] [--export-all]
	     [--timeout=<n>] [--init-timeout=<n>] [--max-connections=<n>]
	     [--strict-paths] [--base-path=<path>] [--base-path-relaxed]
	     [--user-path | --user-path=<path>]
	     [--interpolated-path=<pathtemplate>]
	     [--reuseaddr] [--detach] [--pid-file=<file>]
	     [--enable=<service>] [--disable=<service>]
	     [--allow-override=<service>] [--forbid-override=<service>]
	     [--access-hook=<path>] [--[no-]informative-errors]
	     [--inetd |
	      [--listen=<host-or-ipaddr>] [--port=<n>]
	      [--user=<user> [--group=<group>]]]
	     [--log-destination=(stderr|syslog|none)]
	     [<directory>…​]

描述

一个非常简单的 TCP Git 守护进程,通常监听端口“DEFAULT_GIT_PORT”,即 9418。它等待请求服务的连接,如果服务已启用,则提供该服务。

它验证目录中是否包含名为“git-daemon-export-ok”的 magic 文件,并且会拒绝导出任何没有以这种方式显式标记为可导出(除非指定了 --export-all 参数)的 Git 目录。如果您将一些目录路径作为 git daemon 参数传递,则优惠将限制在这些目录中的仓库。

默认情况下,仅启用 upload-pack 服务,它提供 git fetch-packgit ls-remote 客户端,它们从 git fetchgit pullgit clone 调用。

这非常适合只读更新,例如从 Git 仓库中拉取。

还存在一个 upload-archive 用于提供 git archive

选项

--strict-paths

完全匹配路径(例如,当真实路径为“/foo/repo.git”或“/foo/repo/.git”时,不允许“/foo/repo”),并且不执行用户相关的路径。当启用此选项且未提供目录参数时,git daemon 将拒绝启动。

--base-path=<path>

将所有路径请求重新映射为相对于给定路径的路径。这是一种“Git 根目录” - 如果您在 example.com 上运行 git daemon 并使用 --base-path=/srv/git,那么如果您之后尝试拉取 git://example.com/hello.gitgit daemon 将把路径解释为 /srv/git/hello.git

--base-path-relaxed

如果启用 --base-path 且仓库查找失败,使用此选项,git daemon 将尝试在没有前缀 base 路径的情况下查找。这对于切换到 --base-path 使用非常有用,同时仍允许使用旧路径。

--interpolated-path=<pathtemplate>

为了支持虚拟主机,可以使用插值路径模板动态构建备用路径。模板支持 %H 用于客户端提供的目标主机名,但转换为全小写,%CH 用于规范主机名,%IP 用于服务器的 IP 地址,%P 用于端口号,以及 %D 用于命名仓库的绝对路径。插值后,路径将根据目录列表进行验证。

--export-all

允许从所有看起来像 Git 仓库的目录中拉取(具有 objectsrefs 子目录),即使它们没有 git-daemon-export-ok 文件。

--inetd

让服务器作为 inetd 服务运行。意味着 --syslog(可以使用 --log-destination= 覆盖)。与 --detach、--port、--listen、--user 和 --group 选项不兼容。

--listen=<host-or-ipaddr>

监听特定 IP 地址或主机名。IP 地址可以是 IPv4 地址或 IPv6 地址(如果支持)。如果 IPv6 不受支持,则 --listen=<hostname> 也不受支持,并且 --listen 必须指定 IPv4 地址。可以多次给出。与 --inetd 选项不兼容。

--port=<n>

监听备用端口。与 --inetd 选项不兼容。

--init-timeout=<n>

从建立连接到收到客户端请求(通常是一个相当低的值,因为这应该基本上是立即的)之间的超时时间(以秒为单位)。

--timeout=<n>

特定客户端子请求的超时时间(以秒为单位)。这包括服务器处理子请求所需的时间以及等待下一个客户端请求花费的时间。

--max-connections=<n>

最大并发客户端数量,默认为 32。将其设置为零表示没有限制。

--syslog

--log-destination=syslog 的简写。

--log-destination=<destination>

将日志消息发送到指定的目的地。请注意,此选项不意味着 --verbose,因此默认情况下,只会记录错误情况。<destination> 必须是以下之一:

stderr

写入标准错误。请注意,如果指定了 --detach,则进程会断开与实际标准错误的连接,使此目的地实际上等效于 none

syslog

使用 git-daemon 标识符写入 syslog。

none

禁用所有日志记录。

默认目的地是 syslog(如果指定了 --inetd--detach),否则是 stderr

--user-path
--user-path=<path>

允许在请求中使用 ~user 符号。如果未指定参数,则对 git://host/~alice/foo 的请求被视为访问用户 alice 主目录中的 foo 仓库的请求。如果指定了 --user-path=<path>,则相同的请求被视为访问用户 alice 主目录中的 <path>/foo 仓库的请求。

--verbose

记录有关传入连接和请求文件的详细信息。

--reuseaddr

在绑定监听套接字时使用 SO_REUSEADDR。这允许服务器在不等待旧连接超时的情况下重启。

--detach

从 shell 中分离。意味着 --syslog。

--pid-file=<file>

将进程 ID 保存到 file 中。在 --inetd 下运行守护进程时忽略。

--user=<user>
--group=<group>

在进入服务循环之前更改守护进程的 uid 和 gid。如果仅给出 --user 而未给出 --group,则使用用户的首要组 ID。选项的值将传递给 getpwnam(3)getgrnam(3),并且不支持数字 ID。

在与 --inetd 一起使用时,给出这些选项是一个错误;如果需要,可以使用 inet 守护进程的功能在生成 git daemon 之前实现相同的功能。

与许多切换用户 ID 的程序一样,守护进程在运行 git 程序时不会重置环境变量,例如 $HOME,例如 upload-packreceive-pack。使用此选项时,您可能还想在启动守护进程之前设置和导出 HOME 以指向 <user> 的主目录,并确保该目录中的任何 Git 配置文件都可以被 <user> 读取。

--enable=<service>
--disable=<service>

默认情况下启用/禁用整个网站的服务。请注意,即使在整个网站上禁用了服务,如果服务被标记为可覆盖并且仓库通过配置项启用了服务,则该服务仍然可以在每个仓库中启用。

--allow-override=<service>
--forbid-override=<service>

允许/禁止用每个仓库的配置覆盖站点范围的默认设置。默认情况下,所有服务都可覆盖。

--[no-]informative-errors

当启用信息性错误时,git-daemon 会向客户端报告更详细的错误,区分“没有此仓库”和“仓库未导出”等情况。这对客户端来说更方便,但可能会泄露有关未导出仓库存在的信息。当未启用信息性错误时,所有错误都会向客户端报告“访问被拒绝”。默认情况下为 --no-informative-errors。

--access-hook=<path>

每次客户端连接时,首先运行由 <path> 指定的外部命令,并使用服务名称(例如“upload-pack”)、仓库路径、主机名(%H)、规范主机名(%CH)、IP 地址(%IP)和 TCP 端口(%P)作为其命令行参数。外部命令可以通过非零状态退出来决定拒绝服务(或通过零状态退出来允许服务)。它还可以查看 $REMOTE_ADDR 和 $REMOTE_PORT 环境变量以了解请求者在做出此决定时的信息。

外部命令可以选择将其标准输出写入单行,以便在拒绝服务时将其作为错误消息发送给请求者。

<directory>

其余参数提供目录列表。如果指定了任何目录,则 git-daemon 进程将仅在请求的目录包含在这些目录之一中时才提供该目录。如果指定了 --strict-paths,则请求的目录必须与这些目录之一完全匹配。

服务

可以使用此命令的命令行选项全局启用/禁用这些服务。如果需要更细粒度的控制(例如,仅允许对 git archive 运行在守护进程提供的少数选定仓库中),则可以使用每个仓库的配置文件来启用或禁用它们。

upload-pack

此服务用于 git fetch-packgit 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 设置为处理 /pub/foo/pub/bar 中任何仓库的 inetd 服务,请将类似以下内容的条目放在 /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 设置为处理不同虚拟主机(www.example.comwww.example.org)的仓库的 inetd 服务,请将类似以下内容的条目放在 /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 设置为处理基于其 IP 地址的多个虚拟主机的常规非 inetd 服务,请像这样启动守护进程

	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,请在仓库的配置文件中(即 HEADrefsobjects 旁边的 config 文件)具有以下内容。

	[daemon]
		uploadpack = false
		uploadarch = true

环境

如果 IP 地址可用,git daemon 会将 REMOTE_ADDR 设置为连接到它的客户端的 IP 地址。在执行服务时调用的挂钩的环境中将提供 REMOTE_ADDR。

GIT

git[1] 套件的一部分

scroll-to-top