英语 ▾ 主题 ▾ 最新版本 ▾ 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",并且它将拒绝导出任何未明确标记为导出的 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.git" 或 "/foo/repo/.git" 时,不允许 "/foo/repo")并且不执行用户相关的路径。当启用此选项且未提供目录参数时,*git daemon* 将拒绝启动。

--base-path=<path>

将所有路径请求重新映射为相对于给定路径。 这有点像 "Git root" - 如果你在 example.com 上使用 *--base-path=/srv/git* 运行 *git daemon*,那么如果你稍后尝试拉取 *git://example.com/hello.git*,*git daemon* 将把该路径解释为 /srv/git/hello.git

--base-path-relaxed

如果启用了 --base-path 并且仓库查找失败,使用此选项,*git daemon* 将尝试在不添加基本路径前缀的情况下进行查找。 这对于切换到 --base-path 用法,同时仍然允许旧路径很有用。

--interpolated-path=<pathtemplate>

为了支持虚拟主机,可以使用内插路径模板来动态构造备用路径。 该模板支持 %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=<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

禁用所有日志记录。

如果指定了 --inetd--detach,则默认目的地为 syslog,否则为 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 程序(例如 upload-packreceive-pack)时不会重置环境变量,例如 $HOME。 当使用此选项时,你可能还需要在启动守护程序之前设置并导出 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-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
作为 inetd 服务器的 *git daemon*

要将 *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
用于虚拟主机的作为 inetd 服务器的 *git daemon*

要将 *git daemon* 设置为 inetd 服务,该服务处理不同虚拟主机(www.example.comwww.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* 设置为基于 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*,请在仓库中的配置文件(即 HEAD、*refs* 和 *objects* 旁边的 *config* 文件)中包含以下内容。

	[daemon]
		uploadpack = false
		uploadarch = true

环境变量

如果 IP 地址可用,*git daemon* 将把 REMOTE_ADDR 设置为连接到它的客户端的 IP 地址。 在执行服务时调用的钩子的环境中,可以使用 REMOTE_ADDR。

GIT

git[1] 套件的一部分

scroll-to-top