uTools-Manuals/docs/git/git daemon.html
2019-04-08 23:22:26 +08:00

6 lines
18 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="c-markdown doc-markdown"><div class="doc-postil"><div class="c-markdown"><h2>命名</h2></div></div><div class="doc-postil"><div class="c-markdown"><p>git-daemon  - 一个非常简单的Git仓库服务器</p></div></div><div class="doc-postil"><div class="c-markdown"><h2>概要</h2></div></div><div class="doc-postil"><div class="c-markdown"><pre class="prism-token token language-javascript">git daemon [--verbose] [--syslog] [--export-all]             [--timeout=&lt;n&gt;] [--init-timeout=&lt;n&gt;] [--max-connections=&lt;n&gt;]             [--strict-paths] [--base-path=&lt;path&gt;] [--base-path-relaxed]             [--user-path | --user-path=&lt;path&gt;]             [--interpolated-path=&lt;pathtemplate&gt;]             [--reuseaddr] [--detach] [--pid-file=&lt;file&gt;]             [--enable=&lt;service&gt;] [--disable=&lt;service&gt;]             [--allow-override=&lt;service&gt;] [--forbid-override=&lt;service&gt;]             [--access-hook=&lt;path&gt;] [--[no-]informative-errors]             [--inetd |              [--listen=&lt;host_or_ipaddr&gt;] [--port=&lt;n&gt;]              [--user=&lt;user&gt; [--group=&lt;group&gt;]]]             [&lt;directory&gt;…]</pre></div></div><div class="doc-postil"><div class="c-markdown"><h2>描述</h2></div></div><div class="doc-postil"><div class="c-markdown"><p>一个非常简单的TCP Git守护进程通常在端口“DEFAULT_GIT_PORT”上监听9418.它等待连接请求服务,并在服务启用时提供服务。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>它会验证该目录是否具有魔术文件“git-daemon-export-ok”并且它会拒绝导出任何未明确标记为导出的Git目录除非<code>--export-all</code>指定了该参数)。如果您将某些目录路径作为<code>git daemon</code>参数传递,则可以将报价进一步限制为包含这些参数的白名单。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>默认情况下,只有<code>upload-pack</code>服务已启用,供应<code>git fetch-pack</code><code>git ls-remote</code>客户,这是从调用<code>git fetch</code><code>git pull</code><code>git clone</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>这非常适合只读更新即从Git存储库中提取。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>一个<code>upload-archive</code>也存在服务<code>git archive</code></p></div></div><div class="doc-postil"><div class="c-markdown"><h2>选项</h2></div></div><div class="doc-postil"><div class="c-markdown"><p>--strict-paths</p></div></div><div class="doc-postil"><div class="c-markdown"><p>准确地匹配路径(即当真实路径为“/foo/repo.git”或“/foo/repo/.git”时不允许“/ foo / repo”并且不执行用户相对路径。<code>git daemon</code>将在此选项启用且未指定白名单时拒绝启动。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--base-path=&lt;path&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>将所有路径请求重新映射为相对于给定路径。这是一种“混帐根” -如果您运行<code>git daemon</code><code>--base-path=/srv/git</code>在example.com那么如果您稍后尝试拉<code>git://example.com/hello.git</code><code>git daemon</code>将解释路径<code>/srv/git/hello.git</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>--base-path-relaxed</p></div></div><div class="doc-postil"><div class="c-markdown"><p>如果启用了--base-path并且回购查找失败则使用此选项<code>git daemon</code>将尝试查找而无需为基本路径添加前缀。这对于切换到--base-path用法很有用同时仍然允许旧的路径。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--interpolated-path=&lt;pathtemplate&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>为了支持虚拟主机可以使用内插路径模板来动态构建备用路径。该模板支持由客户端提供的目标主机名的H但转换为全部小写CH表示规范主机名IP表示服务器IP地址P表示端口号D表示绝对路径指定的存储库。插值后路径将根据目录白名单进行验证。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--export-all</p></div></div><div class="doc-postil"><div class="c-markdown"><p>允许从类似Git存储库具有<code>objects</code><code>refs</code>子目录)的所有目录中提取,即使它们没有该<code>git-daemon-export-ok</code>文件。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--inetd</p></div></div><div class="doc-postil"><div class="c-markdown"><p>让服务器作为inetd服务运行。意味着--syslog。与--detach--port--listen--user和--group选项不兼容。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--listen=&lt;host_or_ipaddr&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>监听特定的IP地址或主机名。如果支持IP地址可以是IPv4地址或IPv6地址。如果不支持IPv6则--listen = hostname也不受支持并且 - 必须给予listen。可以给予不止一次。与<code>--inetd</code>选项不兼容。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--port=&lt;n&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>听取另一个端口。与<code>--inetd</code>选项不兼容。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--init-timeout=&lt;n&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>建立连接和接收到客户端请求之间的时间(以秒为单位)(通常是一个相当低的值,因为它应该基本上立即)。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--timeout=&lt;n&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>特定客户端子请求超时(以秒为单位)。这包括服务器处理子请求所用的时间以及等待下一个客户端请求所花费的时间。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--max-connections=&lt;n&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>并发客户端的最大数量默认为32.将其设置为零,无限制。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--syslog</p></div></div><div class="doc-postil"><div class="c-markdown"><p>记录到syslog而不是stderr。请注意这个选项并不意味着--verbose因此默认情况下只会记录错误条件。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--user-path   --user-path=&lt;path&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>允许在请求中使用〜用户符号。当指定不带参数时对git// host /〜alice / foo的请求将作为访问<code>foo</code>用户主目录中存储库的请求<code>alice</code>。如果<code>--user-path=path</code>指定,则将同一请求作为访问<code>path/foo</code>用户主目录中的存储库的请求<code>alice</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>--verbose</p></div></div><div class="doc-postil"><div class="c-markdown"><p>记录有关传入连接和请求文件的详细信息。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--reuseaddr</p></div></div><div class="doc-postil"><div class="c-markdown"><p>绑定侦听套接字时使用SO_REUSEADDR。这允许服务器在不等待旧连接超时的情况下重新启动。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--detach</p></div></div><div class="doc-postil"><div class="c-markdown"><p>从外壳分离。意味着--syslog。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--pid-file=&lt;file&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>保存进程ID <code>file</code>。守护进程运行时忽略<code>--inetd</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>--user=&lt;user&gt;   --group=&lt;group&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>在进入服务循环之前更改守护进程的uid和gid。如果只<code>--user</code>给出没有<code>--group</code>则使用用户的主要组ID。该选项的值给出<code>getpwnam(3)</code>并且<code>getgrnam(3)</code>不支持数字ID。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>使用这些选项时出错是错误的<code>--inetd</code>; <code>git daemon</code>如果需要可以在产卵之前使用inet守护进程的功能来实现。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>像很多切换用户ID的程序一样守护进程不会重置环境变量比如<code>$HOME</code>它运行git程序时比如<code>upload-pack</code><code>receive-pack</code>。使用此选项时,您可能还想在启动守护程序之前将其设置并导出<code>HOME</code>到主目录<code>&lt;user&gt;</code>并确保该目录中的任何Git配置文件都可读<code>&lt;user&gt;</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>--enable=&lt;service&gt;   --disable=&lt;service&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>默认情况下,启用/禁用整个服务站点。请注意,如果服务器被标记为可覆盖,并且存储库通过配置项启用该服务,则每个存储库仍可以启用服务禁用的整个网站。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--allow-override=&lt;service&gt;   --forbid-override=&lt;service&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>允许/禁止覆盖每个存储库配置的站点范围默认值。默认情况下,所有服务都可能被覆盖。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--no-informative-errors</p></div></div><div class="doc-postil"><div class="c-markdown"><p>当信息错误被打开时git-daemon将向客户端报告更多详细错误将“没有这样的存储库”与“未导出的存储库”等条件区分开来。这对客户来说更方便但可能会泄露有关未导出存储库存在的信息。如果未启用信息性错误则所有错误都会向客户报告“拒绝访问”。缺省值是--no-informative-errors。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>--access-hook=&lt;path&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>每次客户端连接时首先运行带有服务名称例如“upload-pack”&lt;path&gt;指定的外部命令存储库路径主机名H规范主机名CHIP地址IP和TCP端口P作为其命令行参数。外部命令可以决定通过以非零状态退出来退出服务或通过以零状态退出来允许它。它还可以查看$ REMOTE_ADDR和<code>$REMOTE_PORT</code>环境变量,以便在做出此决定时了解请求者。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>外部命令可以选择将一行写入其标准输出,以便在拒绝服务时作为错误消息发送给请求方。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>&lt;directory&gt;</p></div></div><div class="doc-postil"><div class="c-markdown"><p>要添加到允许目录的白名单的目录。除非指定了--strict-paths否则它还将包含每个指定目录的子目录。</p></div></div><div class="doc-postil"><div class="c-markdown"><h2>服务</h2></div></div><div class="doc-postil"><div class="c-markdown"><p>这些服务可以使用此命令的命令行选项进行全局启用/禁用。如果需要更细粒度的控制(例如,允许<code>git archive</code>仅针对几个选定的存储库运行守护进程),则可以使用每个存储库配置文件启用或禁用它们。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>upload-pack</p></div></div><div class="doc-postil"><div class="c-markdown"><p>这个服务<code>git fetch-pack</code><code>git ls-remote</code>客户。它是默认启用的,但是一个版本库可以通过设置<code>daemon.uploadpack</code>配置项来禁用它<code>false</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>upload-archive</p></div></div><div class="doc-postil"><div class="c-markdown"><p>这个服务<code>git archive --remote</code>。它默认是禁用的,但是一个存储库可以通过设置<code>daemon.uploadarch</code>配置项来启用它<code>true</code></p></div></div><div class="doc-postil"><div class="c-markdown"><p>receive-pack</p></div></div><div class="doc-postil"><div class="c-markdown"><p>这为<code>git send-pack</code>客户提供服务,允许匿名推送。它在默认情况下是禁用的,因为<code>no</code>在协议中有认证(换句话说,任何人都可以将任何东西推入存储库,包括删除参考)。这仅适用于每个人都很友善的封闭局域网环境。此服务可通过将<code>daemon.receivepack</code>配置项目设置为启用<code>true</code></p></div></div><div class="doc-postil"><div class="c-markdown"><h2>例子</h2></div></div><div class="doc-postil"><div class="c-markdown"><p>我们在/ etc / services中假设如下</p></div></div><div class="doc-postil"><div class="c-markdown"><pre class="prism-token token language-javascript">$ grep 9418 /etc/services
git                9418/tcp                # Git Version Control System</pre></div></div><div class="doc-postil"><div class="c-markdown"><p><em style="font-style: italic;">git守护进程</em>作为inetd服务器</p></div></div><div class="doc-postil"><div class="c-markdown"><p>要设置<code>git daemon</code>一个inetd服务来处理列入白名单的目录集/ pub / foo和/ pub / bar下的任何存储库请在/ etc / inetd中将以下条目全部放在一行中</p></div></div><div class="doc-postil"><div class="c-markdown"><pre class="prism-token token language-javascript">        git stream tcp nowait nobody  /usr/bin/git
                git daemon --inetd --verbose --export-all                /pub/foo /pub/bar</pre></div></div><div class="doc-postil"><div class="c-markdown"><p><em style="font-style: italic;">git守护程序</em>作为虚拟主机的inetd服务器</p></div></div><div class="doc-postil"><div class="c-markdown"><p>要设置<code>git daemon</code>为处理不同虚拟主机的存储库的inetd服务<code>www.example.com</code>并在一行中<code>www.example.org</code>放入类似下面的条目<code>/etc/inetd</code></p></div></div><div class="doc-postil"><div class="c-markdown"><pre class="prism-token token language-javascript">        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</pre></div></div><div class="doc-postil"><div class="c-markdown"><p>在此示例中,根级目录<code>/pub</code>将包含所支持的每个虚拟主机名的子目录。此外,两台主机都简单地将存储库发布为<code>git://www.example.com/software/repo.git</code>。对于1.4.0之前的客户端,<code>/software</code>也可以创建符合链接到相应的默认存储库。</p></div></div><div class="doc-postil"><div class="c-markdown"><p><em style="font-style: italic;">git守护程序</em>作为虚拟主机的常规守护程序</p></div></div><div class="doc-postil"><div class="c-markdown"><p>要设置<code>git daemon</code>为基于其IP地址处理多个虚拟主机的存储库的常规非inetd服务请像下面这样启动守护进程</p></div></div><div class="doc-postil"><div class="c-markdown"><pre class="prism-token token language-javascript">        git daemon --verbose --export-all                --interpolated-path=/pub/%IP/%D                /pub/192.168.1.200/software                /pub/10.10.220.23/software</pre></div></div><div class="doc-postil"><div class="c-markdown"><p>在本例中,根级目录<code>/pub</code>将包含每个支持的虚拟主机IP地址的子目录。尽管存储库仍然可以通过主机名访问但前提是它们与这些IP地址相对应。</p></div></div><div class="doc-postil"><div class="c-markdown"><p>选择性启用/禁用每个存储库的服务</p></div></div><div class="doc-postil"><div class="c-markdown"><p>要启用<code>git archive --remote</code>和禁用<code>git fetch</code>存储库,请在存储库中的配置文件(即,和)<code>config</code>旁边的文件中包含以下内容。<code>HEADrefsobjects</code></p></div></div><div class="doc-postil"><div class="c-markdown"><pre class="prism-token token language-javascript">        [daemon]
                uploadpack = false
                uploadarch = true</pre></div></div><div class="doc-postil"><div class="c-markdown"><h2>环境</h2></div></div><div class="doc-postil"><div class="c-markdown"><p><code>git daemon</code>如果IP地址可用会将REMOTE_ADDR设置为与其连接的客户端的IP地址。REMOTE_ADDR将在服务执行时调用的挂钩环境中可用。</p></div></div></div>