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

名称

git-am - 从邮箱应用一系列补丁

概要

git am [--signoff] [--keep] [--[no-]keep-cr] [--[no-]utf8] [--no-verify]
	 [--[no-]3way] [--interactive] [--committer-date-is-author-date]
	 [--ignore-date] [--ignore-space-change | --ignore-whitespace]
	 [--whitespace=<action>] [-C<n>] [-p<n>] [--directory=<dir>]
	 [--exclude=<path>] [--include=<path>] [--reject] [-q | --quiet]
	 [--[no-]scissors] [-S[<keyid>]] [--patch-format=<format>]
	 [--quoted-cr=<action>]
	 [--empty=(stop|drop|keep)]
	 [(<mbox> | <Maildir>)…​]
git am (--continue | --skip | --abort | --quit | --retry | --show-current-patch[=(diff|raw)] | --allow-empty)

描述

将邮箱中的邮件消息分割成提交日志消息、作者信息和补丁,并将它们应用到当前分支。你可以将其视为在没有合并的历史分支上运行 git-format-patch[1] 的反向操作。

选项

(<mbox>|<Maildir>)…

从中读取补丁的邮箱文件列表。如果不提供此参数,则命令从标准输入读取。如果提供目录,它们将被视为 Maildir。

-s
--signoff

在提交消息中添加一个 Signed-off-by 尾注,使用你的提交者身份。有关更多信息,请参阅 git-commit[1] 中的 signoff 选项。

-k
--keep

-k 标志传递给 git mailinfo (参见 git-mailinfo[1])。

--keep-non-patch

-b 标志传递给 git mailinfo (参见 git-mailinfo[1])。

--keep-cr
--no-keep-cr

使用 --keep-cr 时,调用 git mailsplit (参见 git-mailsplit[1]) 并使用相同的选项,以防止其剥离行尾的 CR。 am.keepcr 配置变量可用于指定默认行为。 --no-keep-cr 可用于覆盖 am.keepcr

-c
--scissors

删除剪刀线之前的所有正文部分 (参见 git-mailinfo[1])。可以通过 mailinfo.scissors 配置变量默认激活。

--no-scissors

忽略剪刀线 (参见 git-mailinfo[1])。

--quoted-cr=<action>

此标志将传递给 git mailinfo (参见 git-mailinfo[1])。

--empty=(drop|keep|stop)

如何处理缺少补丁的电子邮件消息

drop

将跳过电子邮件消息。

keep

将创建一个空提交,并将电子邮件消息的内容作为其日志。

stop

命令将失败,并在当前的 am 会话中间停止。这是默认行为。

-m
--message-id

-m 标志传递给 git mailinfo (参见 git-mailinfo[1]),以便将 Message-ID 报头添加到提交消息中。 am.messageid 配置变量可用于指定默认行为。

--no-message-id

不将 Message-ID 报头添加到提交消息中。 no-message-id 可用于覆盖 am.messageid

-q
--quiet

保持安静。只打印错误消息。

-u
--utf8

-u 标志传递给 git mailinfo (参见 git-mailinfo[1])。从电子邮件中提取的建议的提交日志消息将被重新编码为 UTF-8 编码 (如果项目首选编码不是 UTF-8,可以使用配置变量 i18n.commitEncoding 指定)。

以前版本的 git 中此选项是可选的,现在它是默认选项。你可以使用 --no-utf8 来覆盖此设置。

--no-utf8

-n 标志传递给 git mailinfo (参见 git-mailinfo[1])。

-3
--3way
--no-3way

当补丁无法干净地应用时,如果补丁记录了它应该应用的 blob 的标识,并且我们在本地拥有这些 blob,则回退到 3 向合并。 --no-3way 可用于覆盖 am.threeWay 配置变量。有关更多信息,请参见 git-config[1] 中的 am.threeWay。

--rerere-autoupdate
--no-rerere-autoupdate

在 rerere 机制使用记录的冲突解决来更新工作树中的文件后,允许它也用解决结果更新索引。--no-rerere-autoupdate 是一个很好的方式来双重检查 rerere 所做的操作,并在使用单独的 git add 将结果提交到索引之前,捕获潜在的错误合并。

--ignore-space-change
--ignore-whitespace
--whitespace=<action>
-C<n>
-p<n>
--directory=<dir>
--exclude=<path>
--include=<path>
--reject

这些标志将传递给应用补丁的 git apply 程序 (参见 git-apply[1])。

--whitespace 选项的有效 <action> 包括: nowarnwarnfixerrorerror-all

--patch-format

默认情况下,命令会尝试自动检测补丁格式。此选项允许用户绕过自动检测,并指定补丁应被解释的格式。有效格式为 mbox、mboxrd、stgit、stgit-series 和 hg。

-i
--interactive

交互式运行。

-n
--no-verify

默认情况下,会运行 pre-applypatch 和 applypatch-msg 钩子。当给出 --no-verify-n 中的任何一个时,会绕过这些钩子。另请参见 githooks[5]

--committer-date-is-author-date

默认情况下,命令将电子邮件消息中的日期记录为提交作者日期,并将提交创建的时间作为提交者日期。这允许用户通过使用与作者日期相同的值来伪造提交者日期。

--ignore-date

默认情况下,命令将电子邮件消息中的日期记录为提交作者日期,并将提交创建的时间作为提交者日期。这允许用户通过使用与提交者日期相同的值来伪造作者日期。

--skip

跳过当前补丁。当重新启动被中止的补丁时,这才有意义。

-S[<keyid>]
--gpg-sign[=<keyid>]
--no-gpg-sign

GPG 签名提交。*keyid* 参数是可选的,默认为提交者身份;如果指定,则必须将其紧贴选项,中间无空格。*--no-gpg-sign* 对于抵消 *commit.gpgSign* 配置变量和先前的 *--gpg-sign* 非常有用。

--continue
-r
--resolved

在补丁失败后 (例如,尝试应用冲突的补丁),用户已手动应用它,并且索引文件存储了应用的结果。使用从电子邮件消息中提取的作者信息和提交日志以及当前的索引文件创建一个提交,然后继续。

--resolvemsg=<msg>

当发生补丁失败时,<msg> 将在退出前显示在屏幕上。这将覆盖通知你使用 --continue--skip 来处理失败的标准消息。此选项仅供 git rebasegit am 内部使用。

--abort

恢复原始分支并中止补丁操作。将参与 am 操作的文件内容恢复到 am 之前的状态。

--quit

中止补丁操作,但保持 HEAD 和索引不变。

--retry

尝试重新应用最后一个冲突的补丁。这通常只用于将额外选项传递给重试尝试 (例如,--3way),因为否则你只会再次看到相同的失败。

--show-current-patch[=(diff|raw)]

显示 git am 由于冲突而停止的消息。如果指定了 raw,则显示原始电子邮件消息内容;如果指定了 diff,则只显示 diff 部分。默认为 raw

--allow-empty

在输入电子邮件消息缺少补丁时发生补丁失败后,创建一个空提交,并将电子邮件消息的内容作为其日志消息。

讨论

提交作者姓名取自消息的“From: ”行,提交作者日期取自消息的“Date: ”行。“Subject: ”行用作提交的标题,在剥离常见的“[PATCH <anything>]”前缀之后。“Subject: ”行应在一行文本中简洁地描述提交的内容。

正文开头的“From: ”、“Date: ”和“Subject: ”行会覆盖从报头中获取的相应提交作者姓名和标题值。

提交消息由“Subject: ”中的标题、一个空行以及直到补丁开始的正文组成。每行末尾多余的空格都会被自动剥离。

补丁应为行内补丁,直接跟在消息之后。任何形式的行

  • 三个破折号和行尾,或

  • 以“diff -”开头的行,或

  • 以“Index: ”开头的行

都被视为补丁的开始,提交日志消息在第一次出现这样的行之前终止。

首次调用 git am 时,需要提供要处理的邮箱名称。在看到第一个不适用的补丁后,它会在中间中止。你可以通过以下两种方式之一来恢复:

  1. 使用 --skip 选项重新运行命令,跳过当前补丁。

  2. 手动解决工作目录中的冲突,并更新索引文件以使其处于补丁应生成的状态。然后使用 --continue 选项运行命令。

在当前操作完成之前,该命令拒绝处理新的邮箱,因此如果你决定从头开始,请在用邮箱名称运行命令之前运行 git am --abort

在应用任何补丁之前,ORIG_HEAD 会被设置为当前分支的尖端。如果你在多个提交时遇到问题,例如在错误的分支上运行 git am,或者提交中存在一个错误,该错误可以通过修改邮箱 (例如,修复“From:”行) 更容易地解决,那么这个设置非常有用。

钩子

此命令可以运行 applypatch-msgpre-applypatchpost-applypatch 钩子。有关更多信息,请参见 githooks[5]

配置

本节中以下所有内容均从 git-config[1] 文档中选择性地包含。内容与彼处相同:

am.keepcr

如果为 true,则 git-am 会将 mbox 格式的补丁与参数 --keep-cr 一起传递给 git-mailsplit。在这种情况下,git-mailsplit 不会从以 \r\n 结尾的行中删除 \r。可以通过在命令行上提供 --no-keep-cr 来覆盖。参见 git-am[1], git-mailsplit[1]

am.threeWay

默认情况下,如果补丁无法干净地应用,git am 将失败。当设置为 true 时,此设置指示 git am 在补丁记录了它应该应用的 blob 的标识并且我们本地拥有这些 blob 时,回退到 3 向合并 (相当于从命令行给出 --3way 选项)。默认为 false。参见 git-am[1]

GIT

Git[1] 套件的一部分