簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-cat-file 上次更新於 2.50.0

名稱

git-cat-file - 提供倉庫物件的內容或詳細資訊

概要

git cat-file <type> <object>
git cat-file (-e | -p | -t | -s) <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

如果 <物件> 存在且是有效物件,則以零狀態退出。如果 <物件> 格式無效,則以非零狀態退出並在標準錯誤輸出錯誤。

-p

根據 <物件> 的型別美化列印其內容。

<型別>

通常這與 <物件> 的實際型別匹配,但也允許請求可以從給定 <物件> 輕鬆解引用的型別。例如,請求一個“tree”(樹)型別,而 <物件> 是包含它的提交物件;或者請求一個“blob”(二進位制大物件)型別,而 <物件> 是指向它的標籤物件。

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

使用 mailmap 檔案將作者、提交者和標記者的姓名和電子郵件地址對映到規範的真實姓名和電子郵件地址。參閱 git-shortlog[1]

--textconv

顯示經 textconv 過濾器轉換後的內容。在這種情況下,<物件> 必須是 <tree-ish>:<路徑>:<路徑> 的形式,以便將過濾器應用於索引中 <路徑> 處記錄的內容。

--filters

顯示經當前工作樹中為給定 <路徑> 配置的過濾器(即 smudge 過濾器、行尾轉換等)轉換後的內容。在這種情況下,<物件> 必須是 <tree-ish>:<路徑>:<路徑> 的形式。

--filter=<filter-spec>
--no-filter

從列印物件列表中省略物件。此選項只能與批次模式之一結合使用。透過任何從標準輸入讀取物件的批次模式(--batch--batch-check)明確請求的排除物件將被報告為“已過濾”。在 --batch-all-objects 模式下,排除物件將完全不列印。<filter-spec> 可以是以下之一:

形式 --filter=blob:none 將省略所有二進位制大物件(blob)。

形式 --filter=blob:limit=<n>[kmg] 將省略大小至少為 n 位元組或單位的二進位制大物件。n 可以為零。字尾 k、m 和 g 可用於表示 KiB、MiB 或 GiB 中的單位。例如,blob:limit=1kblob:limit=1024 相同。

形式 --filter=object:type=(tag|commit|tree|blob) 將省略所有不屬於請求型別的物件。

--path=<路徑>

--textconv--filters 一起使用,允許單獨指定物件名稱和路徑,例如當難以找出二進位制大物件(blob)來源的修訂版本時。

--batch
--batch=<格式>

為標準輸入中提供的每個物件列印物件資訊和內容。不得與除 --textconv--filters--use-mailmap 之外的任何其他選項或引數組合使用。

  • --textconv--filters 一起使用時,輸入行必須指定路徑,用空格分隔。有關詳細資訊,請參閱下面的 批次 輸出 部分。

  • --use-mailmap 一起使用時,對於提交(commit)和標籤(tag)物件,輸出的內容部分顯示使用 mailmap 機制替換後的標識,而輸出的資訊部分顯示物件的大小,就好像它實際記錄了替換後的標識一樣。

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

為標準輸入中提供的每個物件列印物件資訊。不得與除 --textconv--filters--use-mailmap 之外的任何其他選項或引數組合使用。

  • --textconv--filters 一起使用時,輸入行必須指定路徑,用空格分隔。有關詳細資訊,請參閱下面的 批次 輸出 部分。

  • --use-mailmap 一起使用時,對於提交(commit)和標籤(tag)物件,列印的物件資訊顯示物件的大小,就好像其中記錄的標識已透過 mailmap 機制替換一樣。

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

進入命令模式,從標準輸入讀取命令和引數。只能與 --buffer--textconv--use-mailmap--filters 組合使用。

  • --textconv--filters 一起使用時,輸入行必須指定路徑,用空格分隔。有關詳細資訊,請參閱下面的 批次 輸出 部分。

  • --use-mailmap 一起使用時,對於提交(commit)和標籤(tag)物件,contents 命令顯示使用 mailmap 機制替換後的標識,而 info 命令顯示物件的大小,就好像它實際記錄了替換後的標識一樣。

--batch-command 識別以下命令:

contents <物件>

為物件引用 <物件> 列印物件內容。這與 --batch 的輸出相對應。

info <物件>

為物件引用 <物件> 列印物件資訊。這與 --batch-check 的輸出相對應。

flush

--buffer 一起使用,以執行自開始或上次發出 flush 命令以來發出的所有先前命令。當使用 --buffer 時,在發出 flush 命令之前不會有任何輸出。當不使用 --buffer 時,命令每次都會重新整理,而無需發出 flush 命令。

--batch-all-objects

不從標準輸入讀取物件列表,而是對倉庫中所有物件和任何備用物件儲存(不僅僅是可到達的物件)執行請求的批次操作。需要指定 --batch--batch-check。預設情況下,物件按其雜湊排序訪問;另請參閱下面的 --unordered。物件按原樣呈現,不遵循 git-replace[1] 的“替換”機制。

--buffer

通常,批次輸出在每個物件輸出後立即重新整理,以便程序可以與 cat-file 進行互動式讀寫。使用此選項,輸出使用正常的標準 I/O 緩衝;這在對大量物件呼叫 --batch-check--batch-command 時效率更高。

--unordered

當使用 --batch-all-objects 時,以一種可能比雜湊順序更有效的方式訪問物件內容的順序來訪問物件。確切的順序細節未指定,但如果您不需要特定順序,這通常會產生更快的輸出,尤其是在使用 --batch 時。請注意,即使物件在倉庫中儲存多次,cat-file 仍只會顯示每個物件一次。

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

對於常規檔案 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,則為 <型別> 之一。

如果指定了 -s,則為 <物件> 的大小(以位元組為單位)。

如果指定了 -e,則無輸出,除非 <物件> 格式錯誤。

如果指定了 -p,則 <物件> 的內容將美化列印。

如果指定了 <型別>,將返回 <物件> 的原始(儘管未壓縮)內容。

批次輸出

如果給定 --batch--batch-checkcat-file 將從標準輸入逐行讀取物件,並以讀取它們的相同順序列印有關它們的資訊。預設情況下,整行被視為一個物件,就好像它被饋送到 git-rev-parse[1] 一樣。

當給定 --batch-command 時,cat-file 將從標準輸入逐行讀取命令,並根據給定命令列印資訊。使用 --batch-commandinfo 命令後跟一個物件將以與 --batch-check 相同的方式列印有關物件的資訊,而 contents 命令後跟一個物件將以與 --batch 相同的方式列印內容。

您可以透過使用自定義 <格式> 指定為每個物件顯示的資訊。 <格式> 將按字面複製到每個物件的標準輸出,其中 %(atom) 形式的佔位符將被展開,後跟一個換行符。可用的原子有:

objectname

物件名稱的完整十六進位制表示。

objecttype

物件的型別(與 cat-file -t 報告的相同)。

objectsize

物件的大小(以位元組為單位,與 cat-file -s 報告的相同)。

objectsize:disk

物件在磁碟上佔用的位元組大小。請參閱下面 注意事項 部分中關於磁碟大小的說明。

deltabase

如果物件在磁碟上以增量(delta)形式儲存,則此項展開為增量基礎物件名稱的完整十六進位制表示。否則,展開為空 OID(全零)。請參閱下面的 注意事項

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

如果在標準輸入上指定了無法解析為倉庫中物件的名稱,則 cat-file 將忽略任何自定義格式並列印

<object> SP missing LF

如果在標準輸入上指定了透過 --filter= 過濾掉的名稱,則 cat-file 將忽略任何自定義格式並列印

<object> SP excluded LF

如果指定的名稱可能引用多個物件(模糊的短 SHA),則 cat-file 將忽略任何自定義格式並列印

<object> SP ambiguous LF

如果使用 --follow-symlinks,並且倉庫中的符號連結指向倉庫外部,則 cat-file 將忽略任何自定義格式並列印

symlink SP <size> LF
<symlink> LF

符號連結可以是絕對路徑(以 / 開頭),也可以是相對於樹根的路徑。例如,如果 dir/link 指向 ../../foo,則 <符號連結> 將是 ../foo<大小> 是符號連結的大小(以位元組為單位)。

如果使用 --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 終止符。這確保瞭如果輸出本身包含換行符,輸出仍然可解析,因此建議用於指令碼目的。

注意事項

請注意,磁碟上物件的大小報告是準確的,但在得出關於哪些引用或物件導致磁碟佔用的結論時應謹慎。打包的非增量(non-delta)物件的大小可能遠大於對其進行增量(delta)的物件的大小,但選擇哪個物件作為基礎和哪個作為增量是任意的,並且在重新打包(repack)期間可能會更改。

另請注意,物件資料庫中可能存在物件的多個副本;在這種情況下,報告哪個副本的大小或增量(delta)基礎是未定義的。

GIT

Git[1] 套件的一部分

scroll-to-top