简体中文 ▾ 主题 ▾ 最新版本 ▾ git-for-each-ref 最后更新于 2.52.0

名称

git-for-each-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> 的引用,并在根据给定的 <key> 集合进行排序后,按照给定的 <format> 显示它们。如果给出了 <count>,则在显示指定数量的引用后停止。<format> 中的内插值可以选择性地用指定宿主语言的字符串字面量引用,从而允许在该语言中直接对其求值。

选项

<pattern>...

如果给出了一个或多个 <pattern> 参数,则仅显示匹配至少一个模式的引用,匹配方式可以使用 fnmatch(3) 或字面匹配,后者为完全匹配或从开头到斜杠的匹配。

--stdin

从标准输入而不是命令行参数列表中读取模式列表。

--count=<count>

显示 <count> 个引用后停止。

--sort=<key>

按字段名 <key> 排序。添加前缀 - 表示按值降序排列。未指定时,默认使用 refname。您可以多次使用 --sort=<key> 选项,在这种情况下,最后一个键成为主键。

--format[=<format>]

一个字符串,内插来自显示的引用及其指向对象的 %(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>

仅列出指向给定对象的引用。

--merged[=<object>]

仅列出其端点可从指定提交(如果未指定则为 HEAD)到达的引用。

--no-merged[=<object>]

仅列出其端点不可从 <object>(如果未指定则为 HEAD)到达的引用。

--contains[=<object>]

仅列出包含 <object>(如果未指定则为 HEAD)的引用。

--no-contains[=<object>]

仅列出不包含 <object>(如果未指定则为 HEAD)的引用。

--ignore-case

对引用的排序和过滤不区分大小写。

--omit-empty

在格式化引用中,如果格式扩展为空字符串,则不在其后打印换行符。

--exclude=<excluded-pattern>

如果给出了一个或多个 --exclude 选项,则仅显示不匹配任何 <excluded-pattern> 参数的引用。匹配规则与上述 <pattern> 相同。

--include-root-refs

除常规引用外,还列出根引用(HEAD 和伪引用)。

--start-after=<marker>

通过跳过直到并包括指定标记的引用来对输出进行分页。分页时应注意,引用可能在两次调用之间被删除、修改或添加。输出将仅产生按字典顺序排在标记之后的引用。输出从按字母顺序排在标记之后的第一个引用开始。不能与 --sort=<key>--stdin 选项一起使用,也不能使用 <pattern> 参数来限制引用。

字段名称

被引用对象中结构化字段的各种值可用于内插到生成的输出中,或作为排序键。

对于所有对象,可以使用以下名称

refname

引用的名称($GIT_DIR/ 之后的部分)。对于引用的无歧义短名称,请追加 :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)。当引用没有足够的组件时,如果使用正数 <n> 剥离,结果为空字符串;如果使用负数 <N> 剥离,则结果为完整 refname。两者均不视为错误。

strip 可作为 lstrip 的同义词使用。

objecttype

对象的类型(blobtreecommittag)。

objectsize

对象的大小(与 git cat-file -s 报告的相同)。追加 :disk 以获取对象在磁盘上占用的字节大小。请参阅下面 CAVEATS(注意事项) 部分中关于磁盘大小的说明。

objectname

对象名称(即 SHA-1)。对于对象名称的无歧义缩写,请追加 :short。对于具有所需长度的对象名称缩写,请追加 :short=<length>,其中最小长度为 MINIMUM_ABBREV。长度可能会超过此值以确保对象名称的唯一性。

deltabase

如果给定对象以增量(delta)形式存储,则此项扩展为增量基底的对象名称。否则,它扩展为空对象名称(全零)。

upstream

一个本地引用的名称,它可以被视为显示引用的“上游”。以与上述 refname 相同的方式遵循 :short:lstrip:rstrip。此外遵循 :track 来显示 "[ahead N, behind M]" 以及 :trackshort 来显示简明版本:">"(领先)、"<"(落后)、"<>"(领先且落后)或 "="(同步)。当遇到未知的上游引用时,:track 还会打印 "[gone]"。追加 :track,nobracket 以显示不带括号的追踪信息(即 "ahead N, behind M")。

对于任何远程跟踪分支 %(upstream)%(upstream:remotename)%(upstream:remoteref) 分别指代远程仓库的名称和被跟踪的远程引用的名称。换句话说,可以通过使用 refspec %(upstream:remoteref):%(upstream)%(upstream:remotename) 拉取,从而显式且单独地更新远程跟踪分支。

如果引用没有关联的追踪信息,则无效。除 nobracket 以外的所有选项都是互斥的,但如果一起使用,则选择最后一个选项。

push

代表显示引用的 @{push} 位置的本地引用名称。与 upstream 一样遵循 :short:lstrip:rstrip:track:trackshort:remotename:remoteref 选项。如果未配置 @{push} 引用,则产生空字符串。

HEAD

如果 HEAD 匹配当前引用(检出的分支)则为 *,否则为空格 ' '。

color

更改输出颜色。后跟 :<colorname>,其中颜色名称在 git-config[1] 的“CONFIGURATION FILE”部分的 Values 下描述。例如,%(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 引用应用 if 条件时,这很有用。追加 ":equals=<string>" 或 ":notequals=<string>" 以将 %(if:...)%(then) 原子之间的值与给定字符串进行比较。

symref

给定符号引用所指向的引用。如果不是符号引用,则不打印任何内容。以与上述 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 签名的信任级别。可能的输出包括 ultimate(绝对信任)、fully(完全信任)、marginal(有限信任)、never(从不信任)和 undefined(未定义)。

worktreepath

检出该引用的工作区的绝对路径(如果它在任何链接的工作区中被检出)。否则为空字符串。

ahead-behind:<commit-ish>

两个整数,由空格分隔,分别表示将输出引用与格式中指定的 <commit-ish> 进行比较时,领先和落后的提交数量。

is-base:<commit-ish>

在最多一行中,会出现 (<commit-ish>) 以指示最有可能作为产生 <commit-ish> 的分支起点的引用。此选择使用启发式方法:选择使处于 <commit-ish> 的第一父级历史中但不在该引用的第一父级历史中的提交数量最少的引用。

例如,考虑以下几个引用的第一父级历史示意图

*--*--*--*--*--* 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 的第一父级历史与过滤引用的第一父级历史在 BC 的共同第一父级祖先处最早相交,而平局则由排序顺序中最早的引用打破。

请注意,如果 <commit-ish> 的第一父级历史与过滤引用的第一父级历史不相交,则此标记不会出现。

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 也可以像 objectname 一样与修饰符 :short:short=<length> 一起使用。

对于提交和标签对象,特殊的 creatordatecreator 字段将根据对象类型对应于 committertagger 字段中适当的日期或“姓名-邮箱-日期”元组。这些字段旨在处理附注标签和轻量级标签的混合情况。

对于标签对象,带有星号 (*) 前缀的 fieldname 会扩展为被剥离(peeled)对象的 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

消息的第一段(通常是单行)被视为提交或标签消息的“主题”。可以使用字段 subject 代替 contents:subject 以获得相同结果。可以向 subject 追加 :sanitize,以获取适合作为文件名的主题行。

contents:body

提交或标签消息中紧随“主题”之后的剩余部分。

contents:signature

标签的可选 GPG 签名。

contents:lines=<n>

消息的前 <n> 行。

此外,由 git-interpret-trailers[1] 解析的尾注(trailers)通过 trailers[:<option>,...] 获取(或使用历史别名 contents:trailers[:<option>,...])。有关有效的 <option> 值,请参见 git-log[1]trailers 部分。

出于排序目的,具有数值的字段按数值顺序排序(objectsizeauthordatecommitterdatecreatordatetaggerdate)。所有其他字段均按其字节值顺序排序。

还有一个按版本排序的选项,可以通过使用字段名 version:refname 或其别名 v:refname 来实现。

在任何情况下,引用不适用的字段名不会导致错误,而是返回一个空字符串。

作为日期类型字段的特殊情况,您可以通过添加 : 后跟日期格式名称来指定日期的格式(参见 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 的用法。列出所有 head 的前缀:

#!/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)"

注意事项

请注意,磁盘上的对象大小会被准确报告,但在推断哪些引用或对象负责磁盘占用时应谨慎。打包的非增量对象的大小可能比以其为增量基底的对象大得多,但选择哪个对象作为基底以及哪个作为增量是任意的,并可能在重新打包过程中发生变化。

另请注意,对象库中可能存在同一对象的多个副本;在这种情况下,报告哪一个副本的大小或增量基底是未定义的。

注意事项

当组合多个 --contains--no-contains 过滤器时,仅显示至少包含一个 --contains 提交且不包含任何 --no-contains 提交的引用。

当组合多个 --merged--no-merged 过滤器时,仅显示至少一个 --merged 提交可达且不被任何 --no-merged 提交可达的引用。

另请参阅

GIT

Git[1] 套件的一部分