# 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