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 根" - 如果你在 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>
允许在请求中使用 {tilde}user 表示法。当不带参数指定时,对 git://host/{tilde}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。
--enable=<service>, --disable=<service>
默认在站点范围内启用/禁用服务。请注意,站点范围禁用的服务仍然可以通过配置项在每个存储库中启用(如果标记为可覆盖并且存储库启用了服务)。
--allow-override=<service>, --forbid-override=<service>
允许/禁止使用每个存储库配置覆盖站点范围默认值。默认情况下,所有服务都可以被覆盖。
--informative-errors, --no-informative-errors
启用信息性错误时,git-daemon 将向客户端报告更详细的错误,区分"没有此类存储库"和"存储库未导出"等情况。这对客户端更方便,但可能泄露未导出存储库存在的信息。未启用信息性错误时,所有错误向客户端报告"access denied"。默认为 --no-informative-errors。
--access-hook=<path>
每次客户端连接时,首先运行由 <path> 指定的外部命令,以服务名称(例如 "upload-pack")、存储库路径、主机名(%H)、规范主机名(%CH)、IP 地址(%IP)和 TCP 端口(%P)作为其命令行参数。外部命令可以通过以非零状态退出来决定拒绝服务(或以零状态退出允许服务)。 外部命令可以选择性地向其标准输出写入一行,以便在拒绝服务时作为错误消息发送给请求者。
<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 客户端提供服务,允许匿名推送。默认禁用,因为协议中_没有_身份验证(换句话说,任何人都可以向存储库推送任何内容,包括删除引用)。这完全用于友好的封闭 LAN 环境。可以通过将 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' 设置为处理不同虚拟主机存储库的 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。
'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按存储库选择性启用/禁用服务
要对存储库启用 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) 套件的一部分
