简体中文 ▾ 主题 ▾ 最新版本 ▾ git-am 最后更新于 2.50.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,则回退到三方合并。--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,则只显示差异部分。默认为 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 将调用 git-mailsplit 处理 mbox 格式的补丁,并带上参数 --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 可用时,回退到三方合并(相当于在命令行中给出 --3way 选项)。默认为 false。参见 git-am[1]

GIT

Git[1] 套件的一部分

scroll-to-top