## 命名

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`使用（其暗示型“斑点”）。

在第二种形式中，在 stdin 上提供了一个对象列表（由换行符分隔），每个对象的 SHA-1，类型和大小都打印在 stdout 上。使用可选`<format>`参数可以覆盖输出格式。如果指定了其中之一`--textconv`或者`--filters`被指定，则输入需要列出对象名称，后跟路径名称，并用一个空格分隔，以便可以确定适当的驱动程序。

## 选项

<object>

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

-t

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

-s

显示由<object>标识的对象大小，而不是内容。

-e

控制所有输出； 如果<object>存在并且是有效的对象，则返回零状态。

-p

基于其类型 Pretty-print（漂亮地打印）<object>的内容。

<type>

通常情况下，它匹配<object>的实际类型，但是要求可以轻松地从给定<object>取消引用的类型也是允许的。一个例子是要求一个“树”，其中<object>是一个包含它的提交对象，或者要求一个<blob>作为指向它的标记对象。

--textconv

显示由 textconv过滤器转换的内容。在这种情况下，为了将过滤器应用于记录在<path>索引处的内容，<object> 必须采用 <tree-ish>：<path>或<path>的形式。

--filters

显示由当前工作树中为给定<路径>配置的过滤器转换的内容（即涂抹过滤器，行尾转换等）。在这种情况下，<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`大量对象时效率更高。

--allow-unknown-type

允许 -s 或 -t 查询未知类型的破坏/损坏（ broken/corrupt）的对象。

--follow-symlinks

使用 --batch或--batch-check，当请求具有表单 tree-ish：path-in-tree 的扩展 SHA-1 表达式的对象时，请遵循存储库内的符号链接。提供关于链接本身的输出，而不是提供有关链接到对象的输出。如果符号链接指向 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

对于常规文件`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

## 输出

如果`-t`指定了其中一个<type>。

如果`-s`指定，则以字节为单位的<object>的大小。

如果`-e`指定，则不输出。

如果`-p`指定，则<object>的内容将被打印出来。

如果指定<type>，则会返回<object>的原始（但未压缩的）内容。

## 批量输出

如果`--batch`或者`--batch-check`给出，`cat-file`将从标准输入读取对象，每行一个，并打印关于它们的信息。默认情况下，整行被认为是一个对象，就像它被馈送到 git-rev-parse [1] 一样。

您可以使用自定义指定每个对象显示的信息`<format>`。它`<format>`被逐字复制到每个对象的标准输出中，`%(atom)`扩展形式的占位符后跟一个换行符。可用的原子是：

`objectname`

对象的40-十六进制对象名称。

`objecttype`

对象的类型（与`cat-file -t`报告相同）。

`objectsize`

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

`objectsize:disk`

对象在磁盘上占用的大小（以字节为单位）。请参阅`CAVEATS`以下部分有关磁盘大小的说明。

`deltabase`

如果对象存储为磁盘上的增量，则此扩展为delta基本对象的40-hex sha1。否则，展开为 null 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

如果在标准输入中指定了一个名称，该名称无法解析为存储库中的对象，`cat-file`则将忽略任何自定义格式并进行打印：

    <object> SP missing 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

在符号链接解析期间，当文件被用作目录名称时，会打印该文件。

## 注意事项

请注意，磁盘上的对象大小是准确报告的，但应该小心确定哪些引用或对象负责磁盘使用。压缩的非 delta 对象的大小可能远远大于反对它的 delta 对象的大小，但是选择哪个对象是基础，哪个是 delta 是任意的，并且在重新包装期间可能会发生变化。

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