簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-for-each-ref 最後更新於 2.52.0

名稱

git-for-each-ref - 輸出每個 ref 的資訊

概要

git for-each-ref [--count=<count>] [--shell|--perl|--python|--tcl]
		   [(--sort=<key>)…​] [--format=<format>]
		   [--include-root-refs] [--points-at=<object>]
		   [--merged[=<object>]] [--no-merged[=<object>]]
		   [--contains[=<object>]] [--no-contains[=<object>]]
		   [(--exclude=<pattern>)…​] [--start-after=<marker>]
		   [ --stdin | (<pattern>...)]

描述

遍歷所有與 <pattern> 匹配的 ref,並根據給定的 <format> 顯示它們,在根據給定的 <key> 集合排序後。如果給定了 <count>,則在顯示完該數量的 ref 後停止。<format> 中的插值值可以選擇性地以指定宿主語言的字串字面量形式引用,從而允許在該語言中直接求值。

選項

<pattern>...

如果提供了一個或多個 <pattern> 引數,則只顯示與至少一個模式匹配的 ref,匹配可以是使用 fnmatch(3) 或字面量匹配,後一種情況則完全匹配或從開頭匹配到斜槓。

--stdin

模式列表從標準輸入讀取,而不是從引數列表中讀取。

--count=<count>

顯示 <count> 個 ref 後停止。

--sort=<key>

按欄位名稱 <key> 排序。字首 - 表示按值降序排序。未指定時,預設為 refname。您可以多次使用 --sort=<key> 選項,在這種情況下,最後一個鍵將成為主鍵。

--format[=<format>]

一個字串,它將來自正在顯示的 ref 及其指向物件的 %(fieldname) 進行插值。此外,字串字面量 %% 渲染為 %,而 %xx(其中 xx 是十六進位制數字)則渲染為具有十六進位制程式碼 xx 的字元。例如,%00 插值為 \0 (NUL),%09 插值為 \t (TAB),%0a 插值為 \n (LF)。

未指定時,<format> 預設為 %(objectname) SPC %(objecttype) TAB %(refname)

--color[=<when>]

尊重 --format 選項中指定的任何顏色。<when_ 欄位必須是 alwaysneverauto 之一(如果<when> 缺失,則行為如同指定了 always)。

--shell
--perl
--python
--tcl

如果給出,則替換 %(fieldname) 佔位符的字串將被引用為適合指定宿主語言的字串字面量。這旨在生成一個可以被“eval”直接求值的指令碼片段。

--points-at=<object>

只列出指向給定物件的 ref。

--merged[=<object>]

僅列出其提示(tips)可從指定提交(如果未指定則為 HEAD)可達的 ref。

--no-merged[=<object>]

僅列出其提示(tips)不可從<object>(如果未指定則為 HEAD)可達的 ref。

--contains[=<object>]

僅列出包含<object>(如果未指定則為 HEAD)的 ref。

--no-contains[=<object>]

僅列出不包含<object>(如果未指定則為 HEAD)的 ref。

--ignore-case

排序和過濾 ref 時不區分大小寫。

--omit-empty

在格式化引用中,如果格式擴充套件為空字串,則不在其後列印換行符。

--exclude=<excluded-pattern>

如果提供了一個或多個 --exclude 選項,則只顯示不匹配任何 <excluded-pattern> 引數的 ref。匹配使用與上面 <pattern> 相同的規則進行。

--include-root-refs

列出根 ref(HEAD 和偽 ref),與普通 ref 分開。

--start-after=<marker>

允許透過跳過直到幷包括指定標記的引用來分頁輸出。在分頁時,應注意引用可能在呼叫之間被刪除、修改或新增。輸出將僅顯示那些在字母順序上跟隨標記的引用。輸出從在標記之後字母順序上出現的第一個引用開始。不能與 --sort=<key>--stdin 選項,或用於限制 ref 的 <pattern> 引數一起使用。

欄位名稱

引用的物件中的各種結構化欄位值可以用於插值到結果輸出中,或用作排序鍵。

對於所有物件,可以使用以下名稱

refname

ref 的名稱($GIT_DIR/ 之後的ส่วน)。對於 ref 的非歧義短名稱,追加 :short。選項 core.warnAmbiguousRefs 用於選擇嚴格縮寫模式。如果追加 lstrip=<n>rstrip=<n>),則從 refname 的開頭(結尾)剝離 <n> 個斜槓分隔的路徑元件(例如,%(refname:lstrip=2)refs/tags/foo 轉換為 foo,而 %(refname:rstrip=2)refs/tags/foo 轉換為 refs)。如果 <n> 是負數,則從指定末尾剝離儘可能多的路徑元件,以留下 -<n> 個路徑元件(例如,%(refname:lstrip=-2)refs/tags/foo 轉換為 tags/foo,而 %(refname:rstrip=-1)refs/tags/foo 轉換為 refs)。當 ref 沒有足夠的元件時,如果用正數 <n> 剝離,結果將為空字串;如果用負數 <N> 剝離,則結果是完整的 refname。兩者都不是錯誤。

strip 可以用作 lstrip 的同義詞。

objecttype

物件的型別(blobtreecommittag)。

objectsize

物件的大小(與 git cat-file -s 報告的大小相同)。追加 :disk 以獲取物件在磁碟上佔用的位元組數。有關磁碟大小的說明,請參見下文的 注意事項 部分。

objectname

物件名稱(又名 SHA-1)。對於物件名稱的非歧義縮寫,追加 :short。對於所需長度的物件名稱縮寫,追加 :short=<length>,其中最小長度為 MINIMUM_ABBREV。長度可以超出以確保物件名稱的唯一性。

deltabase

這會擴充套件為給定物件的 delta 基物件的名稱(如果它被儲存為 delta)。否則,它會擴充套件為 null 物件名稱(全零)。

upstream

可以被認為是相對於顯示 ref 的“上游”的本地 ref 的名稱。它以與 refname 相同的方式響應 :short:lstrip:rstrip。此外,它響應 :track 以顯示 "[ahead N, behind M]",以及 :trackshort 以顯示簡潔版本:">"(落後)、"<"(超前)、"<>"(同時落後和超前)或 "="(同步)。當遇到未知上游 ref 時,:track 還會列印 "[gone]"。 追加 :track,nobracket 可在不帶括號的情況下顯示跟蹤資訊(即 "ahead N, behind M")。

對於任何遠端跟蹤分支,%(upstream)%(upstream:remotename)%(upstream:remoteref) 分別引用遠端的名稱和被跟蹤遠端 ref 的名稱。換句話說,可以透過使用 refspec %(upstream:remoteref):%(upstream)%(upstream:remotename) 中獲取來顯式且單獨地更新遠端跟蹤分支。

如果 ref 沒有與之關聯的跟蹤資訊,則此選項無效。除 nobracket 外,所有選項都是互斥的,但如果一起使用,則最後一個選項生效。

push

代表顯示 ref 的 @{push} 位置的本地 ref 的名稱。它以與 upstream 相同的方式響應 :short:lstrip:rstrip:track:trackshort:remotename:remoteref 選項。如果未配置 @{push} ref,則生成空字串。

HEAD

如果 HEAD 匹配當前 ref(已檢出的分支),則為“*”,否則為“ ”。

color

更改輸出顏色。後面跟著 :<colorname>,其中顏色名稱在 git-config[1] 的“CONFIGURATION FILE”部分中描述。例如,%(color:bold red)

align

左對齊、居中對齊或右對齊 %(align:...)%(end) 之間的內容。"align:" 後面跟著 width=<width>position=<position>,順序任意,用逗號分隔,其中 <position>leftrightmiddle,預設為 left<width> 是帶有對齊的內容的總長度。為簡潔起見,可以省略 "width=" 和/或 "position=" 字首,而使用裸的 <width><position>。例如,%(align:<width>,<position>)。如果內容長度超過寬度,則不進行對齊。如果與 --quote 一起使用,則 %(align:...)%(end) 之間的所有內容都將被引用,但如果巢狀,則只有最頂層執行引用。

if

用作 %(if)...%(then)...%(end)%(if)...%(then)...%(else)...%(end)。如果 %(if) 之後有一個具有值或字串字面量的原子,則列印 %(then) 之後的所有內容;否則,如果使用了 %(else) 原子,則列印 %(else) 之後的所有內容。我們在評估 %(then) 之前的字串時會忽略空格,這在使用 %(HEAD) 原子(它列印“*”或“ ”)時非常有用,並且我們只想對 HEAD ref 應用 if 條件。追加 ":equals=<string>" 或 ":notequals=<string>" 來比較 %(if:...)%(then) 原子與給定字串之間的值。

symref

給定的符號 ref 指向的 ref。如果不是符號 ref,則不列印任何內容。它以與 refname 相同的方式響應 :short:lstrip:rstrip 選項。

signature

提交的 GPG 簽名。

signature:grade

顯示

G

表示一個良好(有效)的簽名

B

表示一個錯誤的簽名

U

表示一個有效但未知有效性的簽名

X

表示一個已過期的良好籤名

Y

表示一個已過期的金鑰簽發的良好籤名

R

表示一個已吊銷的金鑰簽發的良好籤名

E

表示簽名無法檢查(例如,缺少金鑰)

N

表示沒有簽名。

signature:signer

提交的 GPG 簽名的簽名者。

signature:key

提交的 GPG 簽名的金鑰。

signature:fingerprint

提交的 GPG 簽名的指紋。

signature:primarykeyfingerprint

提交的 GPG 簽名的主金鑰指紋。

signature:trustlevel

提交的 GPG 簽名的信任級別。可能的輸出是 ultimatefullymarginalneverundefined

worktreepath

如果 ref 在任何連結的工作樹中被檢出,則為該工作樹的絕對路徑。否則為空字串。

ahead-behind:<commit-ish>

兩個整數,用空格分隔,分別表示在將輸出 ref 與格式中指定的 <committish> 進行比較時,超前和落後提交的數量。

is-base:<commit-ish>

最多在一行中,將出現 (<commit-ish>) 來指示最有可能用作產生 <commit-ish> 的分支起點的 ref。此選擇是使用啟發式方法做出的:選擇最小化 <commit-ish> 的第一父提交歷史中不在 ref 的第一父提交歷史中的提交數量的 ref。

例如,考慮以下幾個 ref 的第一父提交歷史圖

*--*--*--*--*--* refs/heads/A
\
 \
  *--*--*--* refs/heads/B
   \     \
    \     \
     *     * refs/heads/C
      \
       \
	*--* refs/heads/D

這裡,如果 ABC 是過濾後的引用,並且格式字串是 %(refname):%(is-base:D),則輸出將是

refs/heads/A:
refs/heads/B:(D)
refs/heads/C:

這是因為 D 的第一父提交歷史與過濾後的 ref 的第一父提交歷史最早的交集在 BC 的共同第一父提交祖先處,並且平局是透過排序順序中最早的 ref 來打破的。

請注意,如果 <commit-ish> 的第一父提交歷史與過濾後的 ref 的第一父提交歷史不相交,則此標記將不會出現。

describe[:<option>,...]

一個人類可讀的名稱,類似於 git-describe[1];對於無法描述的提交,則為空字串。describe 字串後面可以跟一個冒號和一種或多種逗號分隔的選項。

tags=<bool-value>

除了僅考慮註解標籤外,還考慮輕量級標籤;有關詳細資訊,請參閱 git-describe[1] 中相應的選項。

abbrev=<number>

使用至少 <number> 個十六進位制數字;有關詳細資訊,請參閱 git-describe[1] 中相應的選項。

match=<pattern>

僅考慮匹配 glob(7) <pattern> 的標籤,排除 refs/tags/ 字首;有關詳細資訊,請參閱 git-describe[1] 中相應的選項。

exclude=<pattern>

不考慮匹配 glob(7) <pattern> 的標籤,排除 refs/tags/ 字首;有關詳細資訊,請參閱 git-describe[1] 中相應的選項。

除了上述內容之外,對於提交和標籤物件,可以使用報頭欄位名稱(treeparentobjecttypetag)來指定報頭欄位中的值。欄位 treeparent 也可以使用修飾符 :short:short=<length>,就像 objectname 一樣。

對於提交和標籤物件,特殊的 creatordatecreator 欄位將對應於 committertagger 欄位中的相應日期或姓名-電子郵件-日期元組,具體取決於物件型別。這些欄位用於處理註解標籤和輕量級標籤的混合。

對於標籤物件,前面帶有星號(*)的 fieldname 會擴充套件到剝離後的物件(peeled object)的 fieldname 值,而不是標籤物件本身的 fieldname 值。

值為姓名-電子郵件-日期元組的欄位(authorcommittertagger)可以附加 nameemaildate 來提取命名的元件。對於電子郵件欄位(authoremailcommitteremailtaggeremail),可以附加 :trim 以獲取不帶尖括號的電子郵件,以及 :localpart 以從修剪後的電子郵件中獲取“@”符號之前的部分。此外,還可以使用 :mailmap 選項以及相應的 :mailmap,trim:mailmap,localpart(順序無關緊要)來獲取 .mailmap 檔案或 mailmap.file 或 mailmap.blob 配置檔案中設定的檔案的姓名和電子郵件值(請參閱 gitmailmap[5])。

物件中的原始資料是 raw

raw:size

物件的原始資料大小。

請注意,--format=%(raw) 不能與 --python--shell--tcl 一起使用,因為這些語言可能不支援其字串變數型別中的任意二進位制資料。

提交或標籤物件中的訊息是 contents,從中可以使用 contents:<part> 提取各種部分

contents:size

提交或標籤訊息的位元組大小。

contents:subject

訊息的第一段,通常是單行,被視為提交或標籤訊息的“主題”。除了 contents:subject,還可以使用 subject 欄位來獲得相同的結果。可以在 subject 後附加 :sanitize 以獲得適合作為檔名的主題行。

contents:body

提交或標籤訊息中位於“主題”之後的部分。

contents:signature

標籤的可選 GPG 簽名。

contents:lines=<n>

訊息的前 <n> 行。

此外,由 git-interpret-trailers[1] 解釋的尾部資訊可以透過 trailers[:<option>,...](或使用歷史別名 contents:trailers[:<option>,...])獲得。對於有效的 <option> 值,請參閱 git-log[1]trailers 部分。

為了排序目的,具有數字值的欄位按數字順序排序(objectsizeauthordatecommitterdatecreatordatetaggerdate)。所有其他欄位用於按其位元組值順序排序。

還有一個按版本排序的選項,這可以透過使用欄位名 version:refname 或其別名 v:refname 來實現。

在任何情況下,指向 ref 所引用的物件不適用的欄位名稱都不會導致錯誤。它將返回一個空字串。

作為日期型別欄位的特殊情況,您可以透過新增 : 後跟日期格式名稱(請參閱 git-rev-list[1]--date 選項可接受的值)來指定日期的格式。如果此格式化是在 --sort 鍵中提供的,則引用將根據格式化字串的位元組值而不是底層時間戳的數字值進行排序。

某些原子(如 %(align)%(if))始終需要匹配的 %(end)。我們稱它們為“開啟原子”,有時表示為 %($open)

當啟用特定於指令碼語言的引用時,頂層開啟原子與其匹配的 %(end) 之間的所有內容都將根據開啟原子的語義進行評估,並且只有其頂層結果才會被引用。

示例

一個直接生成格式化文字的示例。顯示最近的 3 個已標記提交

#!/bin/sh

git for-each-ref --count=3 --sort='-*authordate' \
`--format='From: %(*authorname) %(*authoremail)
Subject: %(*subject)
Date: %(*authordate)
Ref: %(*refname)

%(*body)
' 'refs/tags'

一個簡單的示例,展示了 shell eval 在輸出上的使用,並演示了 --shell 的用法。列出所有 heads 的字首

#!/bin/sh

git for-each-ref --shell --format="ref=%(refname)" refs/heads | \
while read entry
do
	eval "$entry"
	echo `dirname $ref`
done

一個更詳細的關於標籤的報告,演示了格式可以是一個完整的指令碼

#!/bin/sh

fmt='
	r=%(refname)
	t=%(*objecttype)
	T=${r#refs/tags/}

	o=%(*objectname)
	n=%(*authorname)
	e=%(*authoremail)
	s=%(*subject)
	d=%(*authordate)
	b=%(*body)

	kind=Tag
	if test "z$t" = z
	then
		# could be a lightweight tag
		t=%(objecttype)
		kind="Lightweight tag"
		o=%(objectname)
		n=%(authorname)
		e=%(authoremail)
		s=%(subject)
		d=%(authordate)
		b=%(body)
	fi
	echo "$kind $T points at a $t object $o"
	if test "z$t" = zcommit
	then
		echo "The commit was authored by $n $e
at $d, and titled

    $s

Its message reads as:
"
		echo "$b" | sed -e "s/^/    /"
		echo
	fi
'

eval=`git for-each-ref --shell --format="$fmt" \
	--sort='*objecttype' \
	--sort=-taggerdate \
	refs/tags`
eval "$eval"

一個示例,展示 %(if)...%(then)...%(else)...%(end) 的用法。這會在當前分支前新增一個星號。

git for-each-ref --format="%(if)%(HEAD)%(then)* %(else)  %(end)%(refname:short)" refs/heads/

一個示例,展示 %(if)...%(then)...%(end) 的用法。這會列印作者姓名(如果存在)。

git for-each-ref --format="%(refname)%(if)%(authorname)%(then) Authored by: %(authorname)%(end)"

注意事項

請注意,物件在磁碟上的大小被準確報告,但在推斷哪些 ref 或物件導致磁碟使用時應謹慎。已打包的非 delta 物件的大小可能遠大於對其進行 delta 的物件的大小,但哪個物件是基準物件,哪個是 delta 物件,是任意的,並且在重新打包期間可能會發生變化。

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

注意事項

當組合多個 --contains--no-contains 過濾器時,僅顯示至少包含一個 --contains 提交且不包含任何 --no-contains 提交的引用。

當組合多個 --merged--no-merged 過濾器時,僅顯示至少一個 --merged 提交可達且不被任何 --no-merged 提交可達的引用。

另請參閱

GIT

Git[1] 套件的一部分