git-daemon
名称
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 守护程序 _ 参数传递,则可以进一步将要约限制为包含这些路径的白名单。
默认情况下,仅启用upload-pack
服务,该服务为 git fetch-pack 和 git ls-remote 客户端提供服务,这些客户端是从 git fetch 调用的, git pull 和 git clone 。
这非常适合只读更新,即从 Git 存储库中提取。
还存在upload-archive
以服务 _git 存档 _。
OPTIONS
--strict-paths
完全匹配路径(即当真实路径是“/foo/repo.git”或“/foo/repo/.git”时不允许“/ foo / repo”)并且不做用户相对路径。启用此选项且未指定白名单时, _git 守护程序 _ 将拒绝启动。
--base-path=<path>
将所有路径请求重新映射为相对于给定路径。这有点像“Git root” - 如果你在 example.com 上用 –base-path = / srv / git 运行 _git 守护进程 _,那么如果你以后尝试拉 git://example.com/hello.git , _git 守护程序 _ 会将路径解释为 /srv/git/hello.git 。
--base-path-relaxed
如果启用了–base-path 并且 repo lookup 失败,则使用此选项 _git 守护程序 _ 将尝试在不添加基本路径前缀的情况下进行查找。这对于切换到–base-path 用法很有用,同时仍允许旧路径。
--interpolated-path=<pathtemplate>
为了支持虚拟主机,可以使用内插路径模板来动态构建备用路径。模板支持客户端提供的目标主机名%H,但转换为全部小写,%CH 为规范主机名,%IP 为服务器 IP 地址,%P 为端口号,%D 为绝对路径命名的存储库。插值后,路径将根据目录白名单进行验证。
--export-all
允许从所有看起来像 Git 存储库的目录(具有 _ 对象 _ 和 refs 子目录)中拉出,即使它们没有 git-daemon-export-ok ]文件。
--inetd
让服务器作为 inetd 服务运行。意味着–sloglog(可以用--log-destination=
覆盖)。与–detach, - port, - liste, - 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>
允许〜用户表示法用于请求。当没有参数指定时,对 git:// host / ~alice / foo 的请求被视为访问用户alice
主目录中的 foo 存储库的请求。如果指定了--user-path=path
,则将相同的请求作为访问用户alice
的主目录中的path/foo
存储库的请求。
--verbose
记录有关传入连接和请求文件的详细信息。
--reuseaddr
绑定侦听套接字时使用 SO_REUSEADDR。这允许服务器重新启动而无需等待旧连接超时。
--detach
脱离外壳。意味着–sloglog。
--pid-file=<file>
将进程 ID 保存在 _ 文件 _ 中。守护程序在--inetd
下运行时忽略。
--user=<user>
--group=<group>
在进入服务循环之前更改守护进程的 uid 和 gid。如果仅在没有--group
的情况下给出--user
,则使用用户的主要组 ID。选项的值赋予getpwnam(3)
和getgrnam(3)
,不支持数字 ID。
与--inetd
一起使用时,给出这些选项是错误的;如果需要,在产生 _git 守护程序 _ 之前使用 inet 守护程序的功能来实现相同的功能。
与许多切换用户 ID 的程序一样,守护程序在运行 git 程序时不会重置诸如$HOME
之类的环境变量,例如upload-pack
和receive-pack
。使用此选项时,您可能还需要在启动守护程序之前将HOME
设置并导出到的主目录,并确保
可读取该目录中的任何 Git 配置文件。
--enable=<service>
--disable=<service>
默认情况下在站点范围内启用/禁用服务。请注意,如果某个服务器标记为可覆盖,并且存储库通过配置项启用该服务,则仍可以为每个存储库启用站点范围内禁用的服务。
--allow-override=<service>
--forbid-override=<service>
允许/禁止使用每个存储库配置覆盖站点范围的默认值。默认情况下,可以覆盖所有服务。
--[no-]informative-errors
当打开信息性错误时,git-daemon 将向客户端报告更详细的错误,将“no such repository”等条件与“未导出的存储库”区分开来。这对客户来说更方便,但可能会泄漏有关未导出存储库存在的信息。如果未启用信息性错误,则所有错误都会向客户端报告“拒绝访问”。默认值为–no-informative-errors。
--access-hook=<path>
每次客户端连接时,首先运行由< path>指定的外部命令。具有服务名称(例如“upload-pack”),存储库的路径,主机名(%H),规范主机名(%CH),IP 地址(%IP)和 TCP 端口(%P)作为其命令行参数。外部命令可以通过退出非零状态(或通过以零状态退出来允许它)来决定拒绝服务。在做出此决定时,它还可以查看$ REMOTE_ADDR 和$REMOTE_PORT
环境变量以了解请求者。
外部命令可以选择将单行写入其标准输出,以便在拒绝服务时将其作为错误消息发送给请求者。
<directory>
要添加到允许目录的白名单的目录。除非指定了–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
来启用此服务。
例子
We assume the following in /etc/services
$ grep 9418 /etc/services git 9418/tcp # Git Version Control System
git daemon as inetd server
要将 _git 守护程序 _ 设置为处理列入白名单的目录集/ pub / foo 和/ pub / bar 下的任何存储库的 inetd 服务,请将以下条目放入/ etc / inetd all in one 线:
git stream tcp nowait nobody /usr/bin/git git daemon --inetd --verbose --export-all /pub/foo /pub/bar
git daemon as inetd server for virtual hosts
要将 _git 守护程序 _ 设置为处理不同虚拟主机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 as regular daemon for virtual hosts
要将 _git 守护程序 _ 设置为常规的非 inetd 服务,根据其 IP 地址处理多个虚拟主机的存储库,请启动守护程序,如下所示:
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 地址。
selectively enable/disable services per repository
要启用 git archive --remote 并禁用存储库中的 git fetch ,请在存储库的配置文件中保存以下内容(即文件 config next 到HEAD
, refs 和 _ 对象 _)。
[daemon] uploadpack = false uploadarch = true
环境
如果 IP 地址可用, _git 守护程序 _ 会将 REMOTE_ADDR 设置为与其连接的客户端的 IP 地址。 REMOTE_ADDR 将在执行服务时调用的挂钩环境中可用。
GIT
部分 git [1] 套件
git-update-server-info
名称
git-update-server-info - 更新辅助信息文件以帮助虚拟服务器
概要
git update-server-info [--force]
描述
没有动态包生成的哑服务器必须在GITDIR/info和GITDIR/info和 GIT_DIR / info 和 GIT_OBJECT_DIRECTORY / info 目录中包含一些辅助信息文件,以帮助客户端发现服务器具有哪些引用和包。此命令生成此类辅助文件。
OPTIONS
-f
--force
从头开始更新信息文件。
OUTPUT
目前,该命令会更新以下文件。请参阅 gitrepository-layout [5] ,了解它们的用途:
- 对象/信息/包
- 信息/裁判
GIT
部分 git [1] 套件
git-cat-file
名称
git-cat-file - 提供存储库对象的内容或类型和大小信息
概要
git cat-file (-t [--allow-unknown-type]| -s [--allow-unknown-type]| -e | -p | <type> | --textconv | --filters ) [--path=<path>] <object> git cat-file (--batch | --batch-check) [ --textconv | --filters ] [--follow-symlinks]
描述
在第一种形式中,该命令提供存储库中对象的内容或类型。除非使用-t
或-p
查找对象类型,或者使用-s
查找对象大小,或使用--textconv
或--filters
(暗示类型为“blob”),否则类型是必需的。
在第二种形式中,stdin 上提供了一个对象列表(由换行符分隔),每个对象的 SHA-1,类型和大小都打印在 stdout 上。可以使用可选的参数覆盖输出格式。如果指定了
--textconv
或--filters
,则输入应该列出对象名称,后跟路径名称,由单个空格分隔,以便可以确定相应的驱动程序。
OPTIONS
<object>
要显示的对象的名称。有关拼写对象名称的更完整列表,请参阅 gitrevisions [7] 中的“指定修订”部分。
-t
而不是内容,显示由< object>标识的对象类型。
-s
而不是内容,显示由< object>标识的对象大小。
-e
如果< object>,则退出为零状态存在并且是一个有效的对象。如果< object>是非格式的无效格式退出非零,并在 stderr 上发出错误。
-p
漂亮打印< object>的内容根据其类型。
<type>
通常,这与< object>的实际类型匹配。但是要求一种可以从给定的< object>中解除引用的类型。也是允许的。一个例子是要求一个带有< object>的“树”。是包含它的提交对象,或者要求< object>的“blob”是一个指向它的标记对象。
--textconv
显示由 textconv 过滤器转换的内容。在这种情况下,< object>必须采用< tree-ish>形式:< path>或:< path>为了将过滤器应用于< path>中索引中记录的内容。
--filters
显示由当前工作树中为给定< path>配置的过滤器转换的内容。 (即涂抹过滤器,行尾转换等)。在这种情况下,< object>必须是< tree-ish>:< path>或:< path>的形式。
--path=<path>
与–textconv 或–filters 一起使用时,允许单独指定对象名称和路径,例如当很难弄清楚 blob 来自的修订版。
--batch
--batch=<format>
打印 stdin 上提供的每个对象的对象信息和内容。除了--textconv
或--filters
之外,不能与任何其他选项或参数组合使用,在这种情况下,输入行也需要指定路径,用空格分隔。有关详细信息,请参阅下面的BATCH OUTPUT
部分。
--batch-check
--batch-check=<format>
打印 stdin 上提供的每个对象的对象信息。除了--textconv
或--filters
之外,不能与任何其他选项或参数组合使用,在这种情况下,输入行也需要指定路径,用空格分隔。有关详细信息,请参阅下面的BATCH OUTPUT
部分。
--batch-all-objects
不是在 stdin 上读取对象列表,而是对存储库中的所有对象和任何备用对象存储(不仅仅是可访问的对象)执行请求的批处理操作。需要指定--batch
或--batch-check
。请注意,按顺序访问对象按其哈希值排序。
--buffer
通常在输出每个对象后刷新批输出,以便进程可以从cat-file
以交互方式读写。使用此选项,输出使用正常的 stdio 缓冲;在大量对象上调用--batch-check
时效率更高。
--unordered
使用--batch-all-objects
时,按顺序访问对象,这可能比散列顺序更有效地访问对象内容。订单的确切细节未指定,但如果您不需要特定订单,这通常会导致更快的输出,尤其是--batch
。请注意,cat-file
仍将仅显示每个对象一次,即使它在存储库中多次存储也是如此。
--allow-unknown-type
允许-s 或-t 查询未知类型的已损坏/损坏对象。
--follow-symlinks
使用–batch 或–batch-check 时,在请求具有树形式为 tree-ish:path-in-tree 的扩展 SHA-1 表达式的对象时,请遵循存储库中的符号链接。不提供有关链接本身的输出,而是提供有关链接对象的输出。如果符号链接指向树之外(例如指向/ foo 的链接或指向…/foo 的根级链接),则将打印链接在树之外的部分。
当指定索引中的对象(例如:link
而不是HEAD:link
)而不是树中的对象时,此选项(当前)不能正常工作。
除非使用--batch
或--batch-check
,否则不能(当前)使用此选项。
例如,考虑一个包含以下内容的 git 存储库:
f: a file containing "hello\n" link: a symlink to f dir/link: a symlink to ../f plink: a symlink to ../f alink: a symlink to /etc/passwd
对于常规文件f
,将打印echo HEAD:f | git cat-file --batch
ce013625030ba8dba906f756967f9e9ca394464a blob 6
并且echo HEAD:link | git cat-file --batch --follow-symlinks
将打印与HEAD:dir/link
相同的内容,因为它们都指向HEAD:f
。
没有--follow-symlinks
,这些将打印有关符号链接本身的数据。在HEAD:link
的情况下,你会看到
4d1ae35ba2c8ec712fa2a379db44ad639ca277bd blob 1
plink
和alink
都指向树外,因此它们将分别打印:
symlink 4 ../f
symlink 11 /etc/passwd
OUTPUT
如果指定了-t
,则其中一个< type>。
如果指定了-s
,则< object>的大小。以字节为单位
如果指定了-e
,则不输出,除非< object>是畸形的
如果指定了-p
,则< object>的内容很漂亮。
如果< type>指定了< object>的原始(虽然未压缩)内容。将被退回。
批量输出
如果给出--batch
或--batch-check
,cat-file
将从标准输入读取对象,每行一个,并打印有关它们的信息。默认情况下,整行被视为一个对象,就像它被送到 git-rev-parse [1] 一样。
您可以使用自定义指定为每个对象显示的信息。
按字面复制到每个对象的 stdout,展开
%(atom)
形式的占位符,后跟换行符。可用的原子是:
objectname
对象的 40 十六进制对象名称。
objecttype
对象的类型(与cat-file -t
报告相同)。
objectsize
对象的大小(以字节为单位)(与cat-file -s
报告相同)。
objectsize:disk
对象占用磁盘的大小(以字节为单位)。请参阅下面CAVEATS
部分中有关磁盘大小的说明。
deltabase
如果对象存储为磁盘上的增量,则会扩展为增量基础对象的 40-hex sha1。否则,展开为空 sha1(40 个零)。见下面的CAVEATS
。
rest
如果在输出字符串中使用此原子,则输入行将在第一个空白边界处拆分。在该空格之前的所有字符都被认为是对象名称;在第一次运行空白之后的字符(即,行的“其余”)被输出以代替%(rest)
原子。
如果未指定格式,则默认格式为%(objectname) %(objecttype) %(objectsize)
。
如果指定了--batch
,则对象信息后跟对象内容(由%(objectsize)
字节组成),后跟换行符。
例如,没有自定义格式的--batch
会产生:
<sha1> SP <type> SP <size> LF <contents> LF
而--batch-check='%(objectname) %(objecttype)'
会产生:
<sha1> SP <type> LF
如果在 stdin 上指定了无法解析为存储库中对象的名称,则cat-file
将忽略任何自定义格式并打印:
<object> SP missing LF
如果指定的名称可能引用多个对象(模糊的短 sha),则cat-file
将忽略任何自定义格式并打印:
<object> SP ambiguous LF
如果使用了–follow-symlinks,并且存储库中的符号链接指向存储库外部,则cat-file
将忽略任何自定义格式并打印:
symlink SP <size> LF <symlink> LF
符号链接将是绝对的(以/开头)或相对于树根。例如,如果 dir / link 指向…/…/foo,那么< symlink>将是…/foo。 <大小>符号链接的大小(以字节为单位)。
如果使用–follow-symlinks,将显示以下错误消息:
<object> SP missing LF
在请求的初始符号链接不存在时打印。
dangling SP <size> LF <object> LF
在初始符号链接存在时打印,但它(transitive-of)指向的符号链接不存在。
loop SP <size> LF <object> LF
打印用于符号链接循环(或任何需要解析超过 40 个链接分辨率的符号链接)。
notdir SP <size> LF <object> LF
在符号链接解析期间,当文件用作目录名时,将打印。
CAVEATS
请注意,磁盘上对象的大小是准确报告的,但应该注意得出哪些引用或对象负责磁盘使用的结论。打包的非 delta 对象的大小可能远大于对其增量的对象的大小,但是选择哪个对象是基础并且 delta 是任意的并且在重新打包期间可能会发生变化。
还要注意,对象的多个副本可能存在于对象数据库中;在这种情况下,未定义将报告哪个副本的大小或增量基数。
GIT
部分 git [1] 套件
Git 中文参考(七)(2)https://developer.aliyun.com/article/1565812