# git-cat-file
> 原文: [https://git-scm.com/docs/git-cat-file](https://git-scm.com/docs/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上。可以使用可选的`<format>`参数覆盖输出格式。如果指定了`--textconv`或`--filters`,则输入应该列出对象名称,后跟路径名称,由单个空格分隔,以便可以确定相应的驱动程序。
## OPTIONS
```
<object>
```
要显示的对象的名称。有关拼写对象名称的更完整列表,请参阅 [gitrevisions [7]](https://git-scm.com/docs/gitrevisions) 中的“指定修订”部分。
```
-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]](https://git-scm.com/docs/git-rev-parse) 一样。
您可以使用自定义`<format>`指定为每个对象显示的信息。 `<format>`按字面复制到每个对象的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]](https://git-scm.com/docs/git) 套件
- git
- git-config
- git-help
- git-init
- git-clone
- git-add
- git-status
- git-diff
- git-commit
- git-reset
- git-rm
- git-mv
- git-branch
- git-checkout
- git-merge
- git-mergetool
- git-log
- git-stash
- git-tag
- git-worktree
- git-fetch
- git-pull
- git-push
- git-remote
- git-submodule
- git-show
- git-log
- git-shortlog
- git-describe
- git-apply
- git-cherry-pick
- git-rebase
- git-revert
- git-bisect
- git-blame
- git-grep
- gitattributes
- giteveryday
- gitglossary
- githooks
- gitignore
- gitmodules
- gitrevisions
- gittutorial
- gitworkflows
- git-am
- git-format-patch
- git-send-email
- git-request-pull
- git-svn
- git-fast-import
- git-clean
- git-gc
- git-fsck
- git-reflog
- git-filter-branch
- git-instaweb
- git-archive
- git-bundle
- git-daemon
- git-update-server-info
- git-cat-file
- git-check-ignore
- git-checkout-index
- git-commit-tree
- git-count-objects
- git-diff-index
- git-for-each-ref
- git-hash-object
- git-ls-files
- git-merge-base
- git-read-tree
- git-rev-list
- git-rev-parse
- git-show-ref
- git-symbolic-ref
- git-update-index
- git-update-ref
- git-verify-pack
- git-write-tree