简体中文 ▾ 主题 ▾ 最新版本 ▾ git-daemon 最新更新于 2.50.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”,并且会拒绝导出任何未显式以此方式标记为导出的 Git 目录(除非指定了 --export-all 参数)。如果您将一些目录路径作为 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=<路径>

将所有路径请求重映射为相对于给定路径。这类似于 “Git 根目录”——如果您在 example.com 上运行带有 --base-path=/srv/gitgit daemon,那么如果您稍后尝试从 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 仓库的目录(具有 objectsrefs 子目录)中拉取,即使它们没有 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。将其设置为 0 表示无限制。

--syslog

--log-destination=syslog 的简写。

--log-destination=<目标>

将日志消息发送到指定的目标。请注意,此选项并不暗示 --verbose,因此默认情况下仅记录错误情况。<目标> 必须是以下之一:

stderr

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

syslog

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

none

禁用所有日志记录。

如果指定了 --inetd--detach,则默认目标为 syslog,否则为 stderr

--user-path
--user-path=<路径>

允许在请求中使用 ~user 表示法。在不指定参数的情况下,对 git://host/~alice/foo 的请求将被视为访问用户 alice 主目录下 foo 仓库的请求。如果指定了 --user-path=<路径>,则相同的请求将被视为访问用户 alice 主目录下 <路径>/foo 仓库的请求。

--verbose

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

--reuseaddr

在绑定监听套接字时使用 SO_REUSEADDR。这允许服务器重启,而无需等待旧连接超时。

--detach

从 shell 分离。暗含 --syslog

--pid-file=<文件>

将进程 ID 保存到 <文件> 中。在带有 --inetd 运行守护进程时会被忽略。

--user=<用户>
--group=<组>

在进入服务循环之前更改守护进程的 uid 和 gid。当仅给出 --user 而不给出 --group 时,将使用该用户的主组 ID。该选项的值将提供给 getpwnam(3)getgrnam(3),且不支持数字 ID。

--inetd 一起使用这些选项是错误的;如果需要,请在生成 git daemon 之前,利用 inet 守护进程的功能来实现相同的效果。

与许多切换用户 ID 的程序一样,守护进程在运行 git程序(例如 upload-packreceive-pack)时不会重置环境变量,例如 HOME。使用此选项时,您可能还希望在启动守护进程之前,设置并导出 HOME 指向 <用户> 的主目录,并确保该目录中的所有 Git 配置文件对于 <用户> 都是可读的。

--enable=<服务>
--disable=<服务>

默认在全局范围内启用/禁用服务。请注意,如果在全局范围内禁用了某个服务,但该服务被标记为可覆盖,且仓库通过配置项启用了该服务,则仍可以在每个仓库的基础上启用该服务。

--allow-override=<服务>
--forbid-override=<服务>

允许/禁止使用每个仓库的配置来覆盖全局默认值。默认情况下,所有服务均可被覆盖。

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

当开启通知性错误(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-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] 套件的一部分