Git
英语 ▾ 主题 ▾ 最新版本 ▾ git-cat-file 最后更新于 2.46.1

名称

git-cat-file - 提供存储库对象的内容或详细信息

概要

git cat-file <type> <object>
git cat-file (-e | -p) <object>
git cat-file (-t | -s) [--allow-unknown-type] <object>
git cat-file (--textconv | --filters)
	     [<rev>:<path|tree-ish> | --path=<path|tree-ish> <rev>]
git cat-file (--batch | --batch-check | --batch-command) [--batch-all-objects]
	     [--buffer] [--follow-symlinks] [--unordered]
	     [--textconv | --filters] [-Z]

描述

输出一个或多个对象的内容或其他属性,如大小、类型或 delta 信息。

此命令可以根据是否指定了 --batch 族中的选项来执行两种模式。

在非批处理模式下,该命令提供有关命令行上命名的对象的 信息。

在批处理模式下,参数从标准输入中读取。

选项

<对象>

要显示的对象的名称。有关拼写对象名称的更完整列表,请参阅 gitrevisions[7] 中的“指定修订版本”部分。

-t

显示由 <对象> 标识的对象类型,而不是内容。

-s

显示由 <对象> 标识的对象大小,而不是内容。如果与 --use-mailmap 选项一起使用,将显示使用 mailmap 机制替换身份后更新对象的 大小。

-e

如果 <对象> 存在并且是有效的对象,则退出状态为零。如果 <对象> 格式无效,则退出状态为非零,并在 stderr 上输出错误。

-p

根据其类型美化打印 <对象> 的内容。

<类型>

通常,这与 <对象> 的实际类型匹配,但要求可以从给定 <对象> 中轻松解除引用的类型也是允许的。例如,要求使用 <对象> 是包含它的提交对象的“树”,或者要求使用 <对象> 是指向它的标签对象的“blob”。

--[no-]mailmap
--[no-]use-mailmap

使用 mailmap 文件将作者、提交者和标记者的名称和电子邮件地址映射到规范的真实姓名和电子邮件地址。见 git-shortlog[1]

--textconv

显示由 textconv 过滤器转换的内容。在这种情况下,<对象> 必须采用 <树形修订版本>:<路径>:<路径> 的形式,以便将过滤器应用于索引中 <路径> 处记录的内容。

--filters

显示根据当前工作树中为给定 <路径> 配置的过滤器转换的内容(即模糊过滤器、行尾转换等)。在这种情况下,<对象> 必须采用 <树形修订版本>:<路径>:<路径> 的形式。

--path=<路径>

用于 --textconv--filters,以允许分别指定对象名称和路径,例如,当难以确定 blob 来自哪个修订版本时。

--batch
--batch=<格式>

为 stdin 上提供的每个对象打印对象信息和内容。不能与除 --textconv--filters--use-mailmap 之外的任何其他选项或参数组合使用。

  • 当与 --textconv--filters 一起使用时,输入行必须指定由空格分隔的路径。有关详细信息,请参阅下面的 批处理输出 部分。

  • 当与 --use-mailmap 一起使用时,对于提交和标签对象,输出的内容部分显示使用 mailmap 机制替换的身份,而输出的信息部分显示对象的 大小,就好像它实际记录了替换的身份一样。

--batch-check
--batch-check=<格式>

为 stdin 上提供的每个对象打印对象信息。不能与除 --textconv--filters--use-mailmap 之外的任何其他选项或参数组合使用。

  • 当与 --textconv--filters 一起使用时,输入行必须指定由空格分隔的路径。有关详细信息,请参阅下面的 批处理输出 部分。

  • 当与 --use-mailmap 一起使用时,对于提交和标签对象,打印的对象信息显示对象的 大小,就好像其中记录的身份被 mailmap 机制替换一样。

--batch-command
--batch-command=<格式>

进入命令模式,该模式从 stdin 读取命令和参数。只能与 --buffer--textconv--use-mailmap--filters 组合使用。

  • 当与 --textconv--filters 一起使用时,输入行必须指定由空格分隔的路径。有关详细信息,请参阅下面的 批处理输出 部分。

  • 当与 --use-mailmap 一起使用时,对于提交和标签对象,contents 命令显示使用 mailmap 机制替换的身份,而 info 命令显示对象的 大小,就好像它实际记录了替换的身份一样。

--batch-command 识别以下命令

contents <对象>

为对象引用 <对象> 打印对象内容。这对应于 --batch 的输出。

info <对象>

为对象引用 <对象> 打印对象信息。这对应于 --batch-check 的输出。

flush

--buffer 一起使用,以执行自开始或自上次发出 flush 以来发出的所有先前命令。当使用 --buffer 时,在发出 flush 之前不会出现任何输出。当不使用 --buffer 时,每次都会在不发出 flush 的情况下刷新命令。

--batch-all-objects

不是从 stdin 读取对象列表,而是对存储库中的所有对象以及任何备用对象存储(不仅仅是可访问对象)执行请求的批处理操作。要求指定 --batch--batch-check。默认情况下,对象按其哈希值排序的顺序访问;另见下面的 --unordered。对象按原样呈现,不尊重 git-replace[1] 的“替换”机制。

--buffer

通常,批处理输出在每个对象输出后刷新,以便进程可以交互地读写 cat-file。使用此选项,输出使用正常的 stdio 缓冲;当对大量对象调用 --batch-check--batch-command 时,这效率要高得多。

--unordered

--batch-all-objects 正在使用时,按可能比哈希顺序更有效地访问对象内容的顺序访问对象。顺序的具体细节未指定,但如果您不需要特定的顺序,这通常会使输出更快,尤其是使用 --batch 时。请注意,cat-file 仍然只会显示每个对象一次,即使它在存储库中存储多次。

--allow-unknown-type

允许 -s-t 查询类型未知的损坏/已损坏对象。

使用 --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

对于普通文件 fecho 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

plinkalink都指向树之外,因此它们将分别打印

symlink 4
../f
symlink 11
/etc/passwd
-Z

仅对--batch--batch-check--batch-command有意义;输入和输出以 NUL 结尾而不是以换行符结尾。

-z

仅对--batch--batch-check--batch-command有意义;输入以 NUL 结尾而不是以换行符结尾。此选项已弃用,原因是 -Z 更受推荐,因为输出可能导致歧义。

输出

如果指定了-t,则为<type>之一。

如果指定了-s,则为<object>的大小(以字节为单位)。

如果指定了-e,则不输出,除非<object>格式错误。

如果指定了-p,则会美化打印<object>的内容。

如果指定了<type>,则将返回<object>的原始(但未压缩)内容。

批量输出

如果给出--batch--batch-checkcat-file将从 stdin 读取对象,每行一个,并按读取顺序打印有关这些对象的信息。默认情况下,整行被视为一个对象,就像它被馈送到git-rev-parse[1]一样。

当给出--batch-command时,cat-file将从 stdin 读取命令,每行一个,并根据给出的命令打印信息。使用--batch-command,后面跟着对象的info命令将以与--batch-check相同的方式打印有关对象的信息,而后面跟着对象的contents命令将以与--batch相同的方式打印内容。

您可以使用自定义<format>指定显示的每个对象的 information 。<format>将逐字复制到 stdout 以供每个对象使用,并扩展形式为%(atom)的占位符,后跟换行符。可用的原子为

objectname

对象的完整十六进制表示形式。

objecttype

对象的类型(与cat-file -t报告的相同)。

objectsize

对象的大小(以字节为单位)(与cat-file -s报告的相同)。

objectsize:disk

对象在磁盘上占用的大小(以字节为单位)。请参见下面CAVEATS部分中有关磁盘大小的说明。

deltabase

如果对象在磁盘上存储为 delta,则扩展到 delta 基对象的完整十六进制表示形式。否则,扩展到空 OID(全为零)。请参见下面的CAVEATS

rest

如果此原子用在输出字符串中,则输入行在第一个空格边界处拆分。所有在该空格之前的字符都被视为对象名称;该第一个空格运行后的字符(即该行的“其余部分”)将输出到%(rest)原子所在的位置。

如果没有指定格式,则默认格式为%(objectname) %(objecttype) %(objectsize)

如果指定了--batch,或者如果--batch-commandcontents命令一起使用,则对象信息后面将跟着对象内容(包含%(objectsize)字节),最后跟着一个换行符。

例如,--batch没有自定义格式将产生

<oid> SP <type> SP <size> LF
<contents> LF

--batch-check='%(objectname) %(objecttype)'将产生

<oid> 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<size>是符号链接的大小(以字节为单位)。

如果使用--follow-symlinks,则将显示以下错误消息

<object> SP missing LF

在请求的初始符号链接不存在时打印。

dangling SP <size> LF
<object> LF

在初始符号链接存在但它(传递)指向的内容不存在时打印。

loop SP <size> LF
<object> LF

在符号链接循环(或任何需要超过 40 次链接解析才能解析的符号链接)中打印。

notdir SP <size> LF
<object> LF

在符号链接解析过程中,将文件用作目录名称时打印。

或者,当传递-Z时,上述任何示例中的换行符将被 NUL 终止符替换。这确保了如果输出本身包含换行符,输出将可解析,因此建议在脚本中使用。

注意事项

请注意,磁盘上对象的尺寸报告是准确的,但在得出有关哪些 ref 或对象是磁盘使用原因的结论时要谨慎。打包的非 delta 对象的大小可能远大于针对它进行 delta 的对象的大小,但选择哪个对象是基对象以及哪个对象是 delta 是任意的,并且在重新打包期间可能会发生变化。

还要注意,对象数据库中可能存在对象的多个副本;在这种情况下,哪个副本的大小或 delta 基将被报告是未定义的。

Git

git[1]套件的一部分

scroll-to-top