Git
English ▾ 主题 ▾ 最新版本 ▾ git-am 最后更新于 2.46.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])。

--[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 是一种在将结果提交到索引之前(使用单独的 git add)仔细检查 rerere 的操作并捕获潜在的错误合并的好方法。

--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

如果为真,则 git-am 将为 mbox 格式的补丁调用 git-mailsplit,并使用参数 --keep-cr。在这种情况下,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] 套件的一部分

scroll-to-top