简体中文 ▾ 主题 ▾ 最新版本 ▾ git-notes 最后更新于 2.50.0

名称

git-notes - 添加或查看对象注释

概要

git notes [list [<object>]]
git notes add [-f] [--allow-empty] [--[no-]separator | --separator=<paragraph-break>] [--[no-]stripspace] [-F <file> | -m <msg> | (-c | -C) <object>] [-e] [<object>]
git notes copy [-f] ( --stdin | <from-object> [<to-object>] )
git notes append [--allow-empty] [--[no-]separator | --separator=<paragraph-break>] [--[no-]stripspace] [-F <file> | -m <msg> | (-c | -C) <object>] [-e] [<object>]
git notes edit [--allow-empty] [<object>] [--[no-]stripspace]
git notes show [<object>]
git notes merge [-v | -q] [-s <strategy> ] <notes-ref>
git notes merge --commit [-v | -q]
git notes merge --abort [-v | -q]
git notes remove [--ignore-missing] [--stdin] [<object>…​]
git notes prune [-n] [-v]
git notes get-ref

描述

添加、删除或读取附加在对象上的注释,而无需修改对象本身。

默认情况下,注释保存于 refs/notes/commits 并从中读取,但此默认设置可以被覆盖。请参阅下方的“选项”、“配置”和“环境变量”部分。如果该引用不存在,在首次需要存储注释时它会被静默创建。

注释的一个典型用途是在不修改提交本身的情况下补充提交信息。注释可以通过 git log 与原始提交信息一同显示。为了将这些注释与存储在提交对象中的消息区分开来,注释会像消息一样缩进,并在显示“Notes (<refname>):”(或者对于 refs/notes/commits 显示“Notes:”)的非缩进行之后显示。

通过使用 --notes 选项,注释也可以添加到由 git format-patch 准备的补丁中。此类注释作为补丁注释添加在三个横线分隔符之后。

要更改 git log 显示哪些注释,请参阅 配置 部分中关于 notes.displayRef 的讨论。

请参阅 notes.rewrite.<command> 配置,了解如何在重写提交的命令之间传递注释。

子命令

list

列出给定对象的注释对象。如果没有指定对象,则显示所有注释对象及其所注解对象的列表(格式为 "<note-object> <annotated-object>")。如果未提供子命令,这是默认的子命令。

add

为给定的对象(默认为 HEAD)添加注释。如果对象已有注释,则中止操作(使用 -f 可覆盖现有注释)。但是,如果您是以交互方式使用 add(使用编辑器提供注释内容),则不会中止,而是会在编辑器中打开现有注释(类似于 edit 子命令)。如果您指定了多个 -m-F,则会在消息之间插入一个空行。使用 --separator 选项可插入其他分隔符。您可以使用 -e 在添加注释之前,以交互方式(使用编辑器)编辑和微调通过 -m-F 选项提供的消息。

copy

将第一个对象的注释复制到第二个对象(默认为 HEAD)。如果第二个对象已有注释,或第一个对象没有注释,则中止操作(使用 -f 可覆盖第二个对象的现有注释)。此子命令等同于:git notes add [-f] -C $(git notes list <from-object>) <to-object>

--stdin 模式下,接收格式为

<from-object> SP <to-object> [ SP <rest> ] LF

的标准输入,并将注释从每个 <from-object> 复制到对应的 <to-object>。(可选的 <rest> 会被忽略,以便该命令能读取提供给 post-rewrite 钩子的输入。)

--stdin 不能与命令行上给出的对象名称组合使用。

append

-m-F 选项提供的新消息附加到现有注释中;如果该对象尚无注释,则将其作为新注释添加(默认为 HEAD)。当附加到现有注释时,会在每条新消息前添加一个空行作为段落分隔符。分隔符可以通过 --separator 选项自定义。使用 -e 在附加注释之前,以交互方式(使用编辑器)编辑通过 -m-F 选项提供的要附加的注释。

edit

编辑给定对象(默认为 HEAD)的注释。

show

显示给定对象(默认为 HEAD)的注释。

merge

将给定的注释引用合并到当前注释引用中。此操作将尝试将给定注释引用(称为“远程”)自合并基点(如果有)以来的更改合并到当前注释引用(称为“本地”)中。

如果出现冲突且未给出自动解决冲突注释的策略(见“注释合并策略”部分),将使用 manual 解析器。该解析器会将冲突的注释检出到一个特殊工作树 (.git/NOTES_MERGE_WORKTREE) 中,并指示用户在那里手动解决冲突。完成后,用户可以通过 git notes merge --commit 完成合并,或使用 git notes merge --abort 中止合并。

remove

删除给定对象的注释(默认为 HEAD)。在命令行给出零个或一个对象时,这等同于向 edit 子命令指定一条空注释消息。

--stdin 模式下,也会删除标准输入上给出的对象名称。换句话说,--stdin 可以与命令行上的对象名称组合使用。

prune

删除所有针对不存在/不可达对象的注释。

get-ref

打印当前注释引用。这提供了一种从脚本中检索当前注释引用的简便方法。

选项

-f
--force

当向已拥有注释的对象添加注释时,覆盖现有注释(而不是中止)。

-m <msg>
--message=<msg>

使用给定的注释消息(而不是提示输入)。如果给出了多个 -m 选项,它们的值将作为单独的段落连接起来。

-F <file>
--file=<file>

从给定文件中读取注释消息。使用 - 可从标准输入读取注释消息。

-C <object>
--reuse-message=<object>

将给定的 blob 对象(例如,另一个注释)作为注释消息。(改用 git notes copy <object> 在对象之间复制注释。)默认包含 --no-stripspace,因为默认行为是逐字复制消息。

-c <object>
--reedit-message=<object>

类似于 -C,但使用 -c 会调用编辑器,以便用户可以进一步编辑注释消息。

--allow-empty

允许存储空的注释对象。默认行为是自动删除空注释。

--separator=<paragraph-break>
--separator
--no-separator

指定用作自定义段落间分隔符的字符串(必要时在末尾添加换行符)。如果使用 --no-separator,段落之间将不会添加任何分隔符。默认为一个空行。

--stripspace
--no-stripspace

清理空白字符。具体来说(参见 git-stripspace[1]):

  • 从所有行中删除末尾的空白字符

  • 将多个连续的空行折叠成一个空行

  • 从输入的开头和结尾删除空行

  • 必要时在最后一行添加缺失的 \n

--stripspace 是默认行为,但 -C/--reuse-message 除外。然而,请记住这取决于类似选项的顺序。例如,对于 -C <object> -m<message>,将使用 --stripspace,因为 -m 的默认行为覆盖了之前的 -C。这是一个已知的限制,未来可能会修复。

--ref=<ref>

操作 <ref> 中的注释树。这会覆盖 GIT_NOTES_REFcore.notesRef 配置。当引用以 refs/notes/ 开头时,它指定了完整的引用名称;当它以 notes/ 开头时,会加上 refs/;否则会加上 refs/notes/ 前缀以形成完整的引用名称。

--ignore-missing

尝试从没有附加注释的对象删除注释时,不将其视为错误。

--stdin

仅对 removecopy 有效。请参阅各自的子命令。

-n
--dry-run

不实际删除任何内容;仅报告将要删除其注释的对象名称。

-s <strategy>
--strategy=<strategy>

合并注释时,使用给定的策略解决注释冲突。可识别的策略如下:manual(默认)、ourstheirsunioncat_sort_uniq。此选项覆盖 notes.mergeStrategy 配置设置。有关每种注释合并策略的更多信息,请参阅下方的“注释合并策略”部分。

--commit

完成正在进行的 git notes merge。当您解决了 git notes merge 存储在 .git/NOTES_MERGE_WORKTREE 中的冲突后,使用此选项。这会通过添加 .git/NOTES_MERGE_WORKTREE 中的注释,来修正由 git notes merge 创建的部分合并提交(存储在 .git/NOTES_MERGE_PARTIAL 中)。存储在 .git/NOTES_MERGE_REF 符号引用中的注释引用将更新为结果提交。

--abort

中止/重置正在进行的 git notes merge,即带有冲突的注释合并。这只会删除所有与注释合并相关的文件。

-q
--quiet

合并注释时,安静地操作。

-v
--verbose

合并注释时,显示更多详细信息。修剪注释时,报告所有被删除注释的对象名称。

讨论

提交注释是包含有关对象额外信息的 blob(通常是补充提交消息的信息)。这些 blob 取自注释引用。注释引用通常是一个分支,其中包含“文件”,其路径就是它们所描述的对象的对象名称,出于性能考虑,其中包含一些目录分隔符 [1]

每次更改注释都会在指定的注释引用上创建一个新的提交。因此,您可以通过运行(例如 git log -p notes/commits)来检查注释的历史记录。目前,提交消息仅记录了触发更新的操作,提交作者身份则根据通常规则确定(参见 git-commit[1])。这些细节未来可能会改变。

也允许注释引用直接指向树对象,在这种情况下,可以使用 git log -p -g <refname> 读取注释的历史记录。

注释合并策略

默认的注释合并策略是 manual,它会将冲突的注释检出到一个特殊工作树(.git/NOTES_MERGE_WORKTREE)中以解决冲突,并指示用户在该工作树中解决冲突。完成后,用户可以通过 git notes merge --commit 完成合并,或通过 git notes merge --abort 中止合并。

用户可以使用 -s/--strategy 选项或相应地配置 notes.mergeStrategy,从以下选项中选择一种自动合并策略:

ours 自动优先使用本地版本(即当前注释引用)来解决冲突的注释。

theirs 自动优先使用远程版本(即正合并到当前注释引用中的给定注释引用)来解决注释冲突。

union 通过连接本地和远程版本来自动解决注释冲突。

cat_sort_uniq 类似于 union,但除了连接本地和远程版本外,该策略还会对结果行进行排序并删除重复行。这等同于对本地和远程版本应用“cat | sort | uniq” shell 管道。如果注释遵循基于行的格式,并且希望在合并结果中避免重复行,则此策略很有用。请注意,如果本地或远程版本在合并前包含重复行,此合并策略也会删除它们。

示例

您可以使用注释来添加提交时无法获得的信息。

$ git notes add -m 'Tested-by: Johannes Sixt <j6t@kdbg.org>' 72a144e2
$ git show -s 72a144e
[...]
    Signed-off-by: Junio C Hamano <gitster@pobox.com>

Notes:
    Tested-by: Johannes Sixt <j6t@kdbg.org>

原则上,注释是普通的 Git blob,且接受任何类型的(非)格式。您可以使用 git hash-object 从任意文件中以二进制安全的方式创建注释:

$ cc *.c
$ blob=$(git hash-object -w a.out)
$ git notes --ref=built add --allow-empty -C "$blob" HEAD

(您不能简单地使用 git notes --ref=built add -F a.out HEAD,因为那不是二进制安全的。)当然,用 git log 显示非文本格式的注释意义不大,因此如果您使用此类注释,可能需要编写一些专门工具来处理它们。

配置

core.notesRef

要读取和操作的注释引用,而不是 refs/notes/commits。必须是一个未缩写的引用名称。此设置可以通过环境变量和命令行覆盖。

本节中此行以上的所有内容均未包含在 git-config[1] 文档中。以下内容与该文档中的内容相同

notes.mergeStrategy

解决 notes 冲突时默认选择的合并策略。必须是 manualourstheirsunioncat_sort_uniq 之一。默认为 manual。有关每种策略的更多信息,请参阅 git-notes[1] 的“NOTES MERGE STRATEGIES”部分。

此设置可以通过向 git-notes[1] 传递 --strategy 选项来覆盖。

notes.<name>.mergeStrategy

在将 notes 合并到 refs/notes/<name> 时选择的合并策略。这会覆盖更通用的 notes.mergeStrategy。有关可用策略的更多信息,请参阅 git-notes[1] 的“NOTES MERGE STRATEGIES”部分。

notes.displayRef

除了由 core.notesRefGIT_NOTES_REF 默认设置之外,还从哪个 ref(或 refs,如果是 glob 或指定多次)读取 notes,用于在显示提交消息时(使用 git-log[1] 系列命令)。

此设置可以通过 GIT_NOTES_DISPLAY_REF 环境变量覆盖,该变量必须是一个以冒号分隔的引用或 glob 列表。

对于不存在的引用将发出警告,但与任何引用不匹配的 glob 将被静默忽略。

此设置可以通过 git-log[1] 系列命令的 --no-notes 选项禁用,或通过这些命令接受的 --notes=<ref> 选项。

core.notesRef 的有效值(可能被 GIT_NOTES_REF 覆盖)也会隐式添加到要显示的引用列表中。

notes.rewrite.<command>

使用 <command>(当前为 amendrebase)重写提交时,如果此变量为 false,则 git 不会从原始提交复制 notes 到重写的提交。默认为 true。另请参阅下面的 notes.rewriteRef

此设置可以通过 GIT_NOTES_REWRITE_REF 环境变量覆盖,该变量必须是一个以冒号分隔的引用或 glob 列表。

notes.rewriteMode

复制重写笔记时(请参阅 notes.rewrite.<command> 选项),确定在目标提交已包含笔记时应执行的操作。必须是以下值之一:overwriteconcatenatecat_sort_uniqignore。默认为 concatenate

此设置可以通过 GIT_NOTES_REWRITE_MODE 环境变量覆盖。

notes.rewriteRef

在重写期间复制备注时,指定(完全限定的)要复制备注的引用。可以是一个 glob,在这种情况下,所有匹配引用中的备注都将被复制。您也可以多次指定此配置。

没有默认值;您必须配置此变量才能启用备注重写。将其设置为 refs/notes/commits 以启用默认提交备注的重写。

可以通过 GIT_NOTES_REWRITE_REF 环境变量覆盖。有关其格式的进一步描述,请参见上面的 notes.rewrite.<command>

环境变量

GIT_NOTES_REF

操作注释时使用的引用,而不是 refs/notes/commits。这会覆盖 core.notesRef 设置。

GIT_NOTES_DISPLAY_REF

冒号分隔的引用或 glob 列表,指明在显示提交消息时,除了 core.notesRefGIT_NOTES_REF 默认值外,还要从哪些引用读取注释。这会覆盖 notes.displayRef 设置。

对于不存在的引用将发出警告,但与任何引用不匹配的 glob 将被静默忽略。

GIT_NOTES_REWRITE_MODE

重写过程中复制注释时,如果目标提交已经有注释该怎么办。必须是 overwriteconcatenatecat_sort_uniqignore 之一。这会覆盖 core.rewriteMode 设置。

GIT_NOTES_REWRITE_REF

重写提交时,要将哪些注释从原始提交复制到重写后的提交。必须是冒号分隔的引用或 glob 列表。

如果未在环境中设置,则要复制的注释列表取决于 notes.rewrite.<command>notes.rewriteRef 设置。

GIT

Git[1] 套件的一部分


1. 允许的路径名格式为 bf/fe/30/…​/680d5a…​:一系列由两个十六进制数字组成的目录名,后跟一个包含对象 ID 其余部分的文件名。