English ▾ 主题 ▾ 最新版本 ▾ 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]

描述

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

此命令可以两种模式运行,具体取决于是否指定了来自 --batch 系列的选项。

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

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

选项

<对象>

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

-t

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

-s

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

-e

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

-p

根据 <对象> 的类型,以美观的方式打印其内容。

<类型>

通常,这与 <对象> 的真实类型匹配,但允许请求可以从给定 <对象> 轻松解引用的类型。 一个例子是请求一个 "tree",其中 <对象> 是包含它的提交对象,或者请求一个 "blob",其中 <对象> 是指向它的标签对象。

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

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

--textconv

显示由 textconv 过滤器转换的内容。 在这种情况下,<对象> 必须是 <tree-ish>:<path> 形式,或者 :<path> 形式,以便将过滤器应用于索引中记录在 <path> 的内容。

--filters

显示由当前工作树中为给定 <path> 配置的过滤器(即,涂抹过滤器、行尾转换等)转换的内容。 在这种情况下,<对象> 必须是 <tree-ish>:<path> 形式,或者 :<path>

--path=<路径>

--textconv--filters 一起使用,以允许单独指定对象名称和路径,例如,当难以确定 blob 来自哪个修订时。

--batch
--batch=<格式>

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

  • --textconv--filters 一起使用时,输入行必须指定路径,以空格分隔。 有关详细信息,请参阅下面的 BATCH OUTPUT 部分。

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

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

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

  • --textconv--filters 一起使用时,输入行必须指定路径,以空格分隔。 有关详细信息,请参阅下面的 BATCH OUTPUT 部分。

  • --use-mailmap 一起使用时,对于 commit 和 tag 对象,打印的对象信息显示对象的大小,就好像其中记录的标识被 mailmap 机制替换一样。

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

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

  • --textconv--filters 一起使用时,输入行必须指定路径,以空格分隔。 有关详细信息,请参阅下面的 BATCH OUTPUT 部分。

  • --use-mailmap 一起使用时,对于 commit 和 tag 对象,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 时,当请求具有扩展 SHA-1 表达式(形式为 tree-ish:树中路径)的对象时,跟随仓库内的符号链接。不提供关于链接本身的输出,而是提供关于链接到的对象的输出。如果符号链接指向 tree-ish 之外(例如,指向 /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-commandinfo 命令后跟一个对象将以与 --batch-check 相同的方式打印关于该对象的信息,而 contents 命令后跟一个对象将以与 --batch 相同的方式打印内容。

您可以使用自定义的 <format> 来指定为每个对象显示的信息。<format> 被逐字复制到 stdout,每个对象一个,其中 %(atom) 形式的占位符被展开,后跟一个换行符。可用的原子有:

objectname

对象名称的完整十六进制表示。

objecttype

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

objectsize

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

objectsize:disk

对象在磁盘上占用的空间大小,以字节为单位。请参阅下面 CAVEATS 部分中关于磁盘大小的说明。

deltabase

如果对象存储为磁盘上的增量,则将其展开为增量基础对象名称的完整十六进制表示。否则,展开为 null 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 终止符。这确保了如果输出本身包含换行符,则输出将可解析,因此建议用于脚本编写目的。

注意事项

请注意,磁盘上对象的大小报告准确,但在得出关于哪些引用或对象负责磁盘使用情况的结论时应谨慎。打包的非增量对象的大小可能比增量依赖它的对象大得多,但是选择哪个对象是基础以及哪个对象是增量是任意的,并且在重新打包期间可能会更改。

另请注意,对象的多个副本可能存在于对象数据库中;在这种情况下,将报告哪个副本的大小或增量基础是未定义的。

GIT

属于 git[1] 套件的一部分

scroll-to-top