Git
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

根據 <物件> 的類型,以美觀的方式列印其內容。

<類型>

通常這會符合 <物件> 的實際類型,但也允許要求可以從給定的 <物件> 輕鬆取消參考的類型。一個範例是要求以包含樹狀結構的提交物件做為 <物件> 的「樹狀結構」,或以指向它的標籤物件做為 <物件> 的「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 一起使用時,輸入行必須指定路徑,並以空白分隔。請參閱下方 批次輸出 章節以了解詳細資訊。

  • 當與 --use-mailmap 一起使用時,對於提交和標籤物件,輸出的內容部分會顯示使用 mailmap 機制取代的識別碼,而輸出的資訊部分會顯示物件的大小,如同它實際記錄了取代的識別碼一樣。

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

列印從 stdin 提供的每個物件的物件資訊。除非使用 --textconv--filters--use-mailmap,否則不得與任何其他選項或引數組合使用。

  • 當與 --textconv--filters 一起使用時,輸入行必須指定路徑,並以空白分隔。請參閱下方 批次輸出 章節以了解詳細資訊。

  • 當與 --use-mailmap 一起使用時,對於提交和標籤物件,列印的物件資訊會顯示物件的大小,如同其中記錄的識別碼被 mailmap 機制取代一樣。

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

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

  • 當與 --textconv--filters 一起使用時,輸入行必須指定路徑,並以空白分隔。請參閱下方 批次輸出 章節以了解詳細資訊。

  • 當與 --use-mailmap 一起使用時,對於提交和標籤物件,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 時,當要求使用 樹狀結構-ish:樹狀結構中的路徑 形式的擴充 SHA-1 表示法的物件時,請遵循儲存庫內的符號連結。不是提供關於連結本身的輸出,而是提供關於連結物件的輸出。如果符號連結指向樹狀結構-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

如果物件以磁碟上的差異形式儲存,則此項會展開為差異基礎物件名稱的完整十六進位表示法。否則,會展開為空 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