git daemon

优质
小牛编辑
129浏览
2023-12-01

命名

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>]]]             [<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=<path>

将所有路径请求重新映射为相对于给定路径。这是一种“混帐根” -如果您运行git daemon--base-path=/srv/git在example.com,那么如果您稍后尝试拉git://example.com/hello.gitgit 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存储库(具有objectsrefs子目录)的所有目录中提取,即使它们没有该git-daemon-export-ok文件。

--inetd

让服务器作为inetd服务运行。意味着--syslog。与--detach,--port,--listen,--user和--group选项不兼容。

--listen=<host_or_ipaddr>

监听特定的IP地址或主机名。如果支持,IP地址可以是IPv4地址或IPv6地址。如果不支持IPv6,则--listen = hostname也不受支持,并且 - 必须给予listen。可以给予不止一次。与--inetd选项不兼容。

--port=<n>

听取另一个端口。与--inetd选项不兼容。

--init-timeout=<n>

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

--timeout=<n>

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

--max-connections=<n>

并发客户端的最大数量,默认为32.将其设置为零,无限制。

--syslog

记录到syslog而不是stderr。请注意,这个选项并不意味着--verbose,因此默认情况下只会记录错误条件。

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

允许在请求中使用〜用户符号。当指定不带参数时,对git:// host /〜alice / foo的请求将作为访问foo用户主目录中存储库的请求alice。如果--user-path=path指定,则将同一请求作为访问path/foo用户主目录中的存储库的请求alice

--verbose

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

--reuseaddr

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

--detach

从外壳分离。意味着--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的程序一样,守护进程不会重置环境变量,比如$HOME它运行git程序时,比如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>

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

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

<directory>

要添加到允许目录的白名单的目录。除非指定了--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客户提供服务,允许匿名推送。它在默认情况下是禁用的,因为no在协议中有认证(换句话说,任何人都可以将任何东西推入存储库,包括删除参考)。这仅适用于每个人都很友善的封闭局域网环境。此服务可通过将daemon.receivepack配置项目设置为启用true

例子

我们在/ etc / services中假设如下

$ grep 9418 /etc/services
git                9418/tcp                # Git Version Control System

git守护进程作为inetd服务器

要设置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

git守护程序作为虚拟主机的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。对于1.4.0之前的客户端,/software也可以创建符合链接到相应的默认存储库。

git守护程序作为虚拟主机的常规守护程序

要设置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存储库,请在存储库中的配置文件(即,和)config旁边的文件中包含以下内容。HEADrefsobjects

        [daemon]
                uploadpack = false
                uploadarch = true

环境

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