设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.50.1 无更改
-
2.50.0
2025-06-16
- 2.44.1 → 2.49.1 无更改
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.7 无更改
-
2.43.0
2023-11-20
- 2.37.3 → 2.42.4 无更改
-
2.37.2
2022-08-11
- 2.22.1 → 2.37.1 无更改
-
2.22.0
2019-06-07
- 2.17.1 → 2.21.4 无变更
-
2.17.0
2018-04-02
- 2.10.5 → 2.16.6 无更改
-
2.9.5
2017-07-30
- 2.2.3 → 2.8.6 无变更
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
概要
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
上运行git
daemon
并使用--base-path=/srv/git
,那么当你稍后尝试从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> 必须是以下之一:如果指定了
--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
一起使用会报错;如果需要,请在启动git
daemon
之前使用 inet 守护进程的功能来实现相同目的。与许多切换用户 ID 的程序一样,当守护进程运行 Git 程序(例如
upload-pack
和receive-pack
)时,它不会重置HOME
等环境变量。使用此选项时,你可能还希望在启动守护进程之前设置并导出HOME
指向 <user> 的主目录,并确保该目录中的任何 Git 配置文件可被 <user> 读取。 --enable=
<service>--disable=
<service>-
默认情况下在全站启用/禁用服务。请注意,如果服务被标记为可覆盖并且仓库通过配置项启用了该服务,则全站禁用的服务仍然可以针对每个仓库启用。
--allow-override=
<service>--forbid-override=
<service>-
允许/禁止使用每个仓库的配置覆盖全站默认设置。默认情况下,所有服务都可以被覆盖。
--informative-errors
--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 设置为处理
/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
- 作为虚拟主机的 inetd 服务器的 git daemon
-
要将 git daemon 设置为处理不同虚拟主机(
www.example.com
和www.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
,请在仓库的配置文件中(即HEAD
、refs 和 objects 旁边的 config 文件)添加以下内容。[daemon] uploadpack = false uploadarch = true