Git
英语 ▾ 主题 ▾ 最新版本 ▾ git-send-email 最后更新于 2.47.0

名称

git-send-email - 将一系列补丁作为电子邮件发送

概要

git send-email [<options>] (<file>|<directory>)…​
git send-email [<options>] <format-patch-options>
git send-email --dump-aliases
git send-email --translate-aliases

描述

接收命令行上给出的补丁并通过电子邮件发送。补丁可以指定为文件、目录(将发送目录中的所有文件)或直接作为修订列表。在最后一种情况下,可以将 git-format-patch[1] 接受的任何格式以及 git-format-patch[1] 理解的选项传递给 git send-email。

可以通过命令行选项配置电子邮件的标题。如果命令行上未指定,则会使用支持 ReadLine 的界面提示用户提供必要的信息。

接受两种格式的补丁文件

  1. mbox 格式文件

    这是 git-format-patch[1] 生成的格式。大多数标题和 MIME 格式都会被忽略。

  2. Greg Kroah-Hartman 的 send_lots_of_email.pl 脚本使用的原始格式

    此格式期望文件的首行为“Cc:”值,第二行为消息的“主题:”。

选项

撰写

--annotate

查看并编辑要发送的每个补丁。默认值为 sendemail.annotate 的值。有关 sendemail.multiEdit 的信息,请参见配置部分。

--bcc=<address>,…​

为每封电子邮件指定一个“Bcc:”值。默认值为 sendemail.bcc 的值。

此选项可以多次指定。

--cc=<address>,…​

为每封电子邮件指定一个起始“Cc:”值。默认值为 sendemail.cc 的值。

此选项可以多次指定。

--compose

调用文本编辑器(请参见 git-var[1] 中的 GIT_EDITOR)以编辑补丁系列的介绍性消息。

当使用 --compose 时,git send-email 将使用消息中指定的 From、To、Cc、Bcc、Subject、Reply-To 和 In-Reply-To 标题。如果消息正文(您在标题和空行之后键入的内容)仅包含空行(或以 Git: 为前缀的行),则不会发送摘要,但上述标题将被使用,除非它们被删除。

将提示输入缺失的 From 或 In-Reply-To 标题。

有关 sendemail.multiEdit 的信息,请参见配置部分。

--from=<address>

指定电子邮件的发件人。如果命令行上未指定,则使用 sendemail.from 配置选项的值。如果既未设置命令行选项,也未设置 sendemail.from,则会提示用户输入值。提示的默认值为 GIT_AUTHOR_IDENT 的值,如果没有设置,则为 GIT_COMMITTER_IDENT 的值,如 "git var -l" 所返回的值。

--reply-to=<address>

指定接收者回复应发送到的地址。如果消息回复应发送到与 --from 参数指定的地址不同的地址,请使用此选项。

--in-reply-to=<identifier>

使第一封邮件(或使用 --no-thread 的所有邮件)显示为对给定 Message-ID 的回复,从而避免中断线程以提供新的补丁系列。第二封邮件和后续邮件将根据 --[no-]chain-reply-to 设置作为回复发送。

例如,当指定 --thread--no-chain-reply-to 时,第二封邮件和后续邮件将作为对第一封邮件的回复,如下面的图示所示,其中 [PATCH v2 0/3] 是对 [PATCH 0/2] 的回复。

[PATCH 0/2] Here is what I did...
  [PATCH 1/2] Clean up and tests
  [PATCH 2/2] Implementation
  [PATCH v2 0/3] Here is a reroll
    [PATCH v2 1/3] Clean up
    [PATCH v2 2/3] New tests
    [PATCH v2 3/3] Implementation

仅在也设置了 --compose 时才需要。如果未设置 --compose,将提示您输入。

--subject=<string>

指定电子邮件线程的初始主题。仅在也设置了 --compose 时才需要。如果未设置 --compose,将提示您输入。

--to=<address>,…​

指定生成的电子邮件的主要接收者。通常,这将是相关项目的 upstream 维护者。默认值为 sendemail.to 配置值的 value;如果未指定,并且未指定 --to-cmd,则会提示您输入。

此选项可以多次指定。

--8bit-encoding=<encoding>

当遇到未声明其编码的非 ASCII 消息或主题时,添加标题/引用以指示它以 <encoding> 编码。默认值为 sendemail.assume8bitEncoding 的值;如果未指定,则如果遇到任何非 ASCII 文件,则会提示您输入。

请注意,不会进行任何验证编码的尝试。

--compose-encoding=<encoding>

指定撰写消息的编码。默认值为 sendemail.composeEncoding 的值;如果未指定,则假定为 UTF-8。

--transfer-encoding=(7bit|8bit|quoted-printable|base64|auto)

指定用于通过 SMTP 发送消息的传输编码。7bit 在遇到非 ASCII 消息时将失败。quoted-printable 在存储库包含包含回车符的文件时很有用,但使原始补丁电子邮件文件(从 MUA 保存)更难手动检查。base64 更加防错,但也更加不透明。auto 将尽可能使用 8bit,否则使用 quoted-printable。

默认值为 sendemail.transferEncoding 配置值的 value;如果未指定,则默认使用 auto

--xmailer
--no-xmailer

添加(或防止添加)“X-Mailer:”标题。默认情况下,会添加标题,但可以通过将 sendemail.xmailer 配置变量设置为 false 来将其关闭。

发送

--envelope-sender=<address>

指定用于发送电子邮件的信封发件人。如果您使用的默认地址不是订阅列表的地址,这很有用。要使用 From 地址,请将值设置为“auto”。如果您使用 sendmail 二进制文件,则必须对 -f 参数具有足够的权限。默认值为 sendemail.envelopeSender 配置变量的值;如果未指定,则由 MTA 选择信封发件人。

--sendmail-cmd=<command>

指定要运行的命令以发送电子邮件。该命令应类似于 sendmail;具体来说,它必须支持 -i 选项。如果需要,该命令将在 shell 中执行。默认值为 sendemail.sendmailCmd 的值。如果未指定,并且如果也未指定 --smtp-server,则 git-send-email 将在 /usr/sbin/usr/lib 和 $PATH 中搜索 sendmail

--smtp-encryption=<encryption>

指定 SMTP 连接的加密方式。有效值为 ssltls。任何其他值将恢复为纯文本(未加密)SMTP,默认情况下使用端口 25。尽管有名称,但这两个值都将使用相同的新版 TLS,但出于历史原因,它们具有这些名称。ssl 指的是“隐式”加密(有时称为 SMTPS),默认情况下使用端口 465。tls 指的是“显式”加密(通常称为 STARTTLS),默认情况下使用端口 25。SMTP 服务器可能使用其他端口,这些端口不是默认端口。tls 和未加密的常见替代端口是 587。您需要查看提供商的文档或您的服务器配置以确保您自己的情况。默认值为 sendemail.smtpEncryption 的值。

--smtp-domain=<FQDN>

指定在向 SMTP 服务器发送 HELO/EHLO 命令时使用的完全限定域名 (FQDN)。某些服务器要求 FQDN 与您的 IP 地址匹配。如果未设置,则 git send-email 会尝试自动确定您的 FQDN。默认值为 sendemail.smtpDomain 的值。

--smtp-auth=<mechanisms>

允许的 SMTP-AUTH 机制列表,以空格分隔。此设置强制仅使用列出的机制。例如

$ git send-email --smtp-auth="PLAIN LOGIN GSSAPI" ...

如果至少一个指定的机制与 SMTP 服务器公布的机制匹配,并且它受所用 SASL 库支持,则该机制将用于身份验证。如果未指定 sendemail.smtpAuth--smtp-auth,则可以使用 SASL 库支持的所有机制。特殊值 none 可以指定为完全禁用身份验证,与 --smtp-user 无关。

--smtp-pass[=<password>]

SMTP-AUTH 的密码。参数是可选的:如果未指定参数,则使用空字符串作为密码。默认值为 sendemail.smtpPass 的值,但是 --smtp-pass 始终会覆盖此值。

此外,密码不需要在配置文件或命令行中指定。如果已指定用户名(使用 --smtp-usersendemail.smtpUser),但未指定密码(使用 --smtp-passsendemail.smtpPass),则将使用 git-credential 获取密码。

--no-smtp-auth

禁用 SMTP 身份验证。--smtp-auth=none 的简写。

--smtp-server=<host>

如果设置,则指定要使用的传出 SMTP 服务器(例如 smtp.example.com 或原始 IP 地址)。如果未指定,并且 --sendmail-cmd 也未指定,则默认情况下会在 /usr/sbin/usr/lib 和 $PATH 中搜索 sendmail,如果找到这样的程序,则使用它,否则回退到 localhost

为了向后兼容,此选项还可以指定类似 sendmail 程序的完整路径名;该程序必须支持 -i 选项。此方法不支持传递参数或使用纯命令名称。对于这些用例,请考虑使用 --sendmail-cmd

--smtp-server-port=<port>

指定与默认端口不同的端口(SMTP 服务器通常监听 smtp 端口 25,但也可能监听提交端口 587 或通用的 SSL smtp 端口 465);符号端口名称(例如 "submission" 而不是 587)也被接受。该端口还可以使用 sendemail.smtpServerPort 配置变量设置。

--smtp-server-option=<option>

如果设置,则指定要使用的传出 SMTP 服务器选项。默认值可以通过 sendemail.smtpServerOption 配置选项指定。

对于要传递给服务器的每个选项,必须重复使用 --smtp-server-option 选项。同样,配置文件中的不同行必须用于每个选项。

--smtp-ssl

--smtp-encryption ssl 的传统别名。

--smtp-ssl-cert-path

用于 SMTP SSL/TLS 证书验证的受信任 CA 证书存储的路径(可以是已由 c_rehash 处理的目录,也可以是包含一个或多个 PEM 格式证书的单个文件,这些证书串联在一起:有关这些的更多信息,请参阅 verify(1) -CAfile 和 -CApath)。将其设置为空字符串以禁用证书验证。默认为 sendemail.smtpSSLCertPath 配置变量的值(如果已设置),否则默认为支持的 SSL 库的编译时默认值(这应该是大多数平台上的最佳选择)。

--smtp-user=<user>

SMTP-AUTH 的用户名。默认为 sendemail.smtpUser 的值;如果未指定用户名(使用 --smtp-usersendemail.smtpUser),则不会尝试进行身份验证。

--smtp-debug=(0|1)

启用 (1) 或禁用 (0) 调试输出。如果启用,将打印 SMTP 命令和回复。这对于调试 TLS 连接和身份验证问题很有用。

--batch-size=<num>

某些电子邮件服务器(例如 smtp.163.com)限制每个会话(连接)发送的电子邮件数量,这会导致在发送大量邮件时失败。使用此选项,send-email 将在发送 $<num> 条邮件后断开连接,等待几秒钟(请参阅 --relogin-delay),然后重新连接,以解决此限制。您可能需要使用某种形式的凭据助手来避免每次发生这种情况时都必须重新输入密码。默认为 sendemail.smtpBatchSize 配置变量。

--relogin-delay=<int>

在重新连接到 SMTP 服务器之前等待 $<int> 秒。与 --batch-size 选项一起使用。默认为 sendemail.smtpReloginDelay 配置变量。

自动化

--no-to
--no-cc
--no-bcc

清除以前通过配置设置的任何 "To:"、"Cc:"、"Bcc:" 地址列表。

--no-identity

清除以前通过配置设置的 sendemail.identity 值(如果有)。

--to-cmd=<command>

指定一个命令,该命令应针对每个补丁文件执行一次,以生成特定于补丁文件的 "To:" 条目。此命令的输出必须是每行一个电子邮件地址。默认为 sendemail.toCmd 配置值。

--cc-cmd=<command>

指定一个命令,该命令应针对每个补丁文件执行一次,以生成特定于补丁文件的 "Cc:" 条目。此命令的输出必须是每行一个电子邮件地址。默认为 sendemail.ccCmd 配置值。

--header-cmd=<command>

指定一个命令,该命令针对每个传出邮件执行一次,并将 RFC 2822 样式的标题行输出到这些邮件中。当设置 sendemail.headerCmd 配置变量时,始终使用其值。当在命令行中提供 --header-cmd 时,其值将优先于 sendemail.headerCmd 配置变量的值。

--no-header-cmd

禁用任何正在使用的标题命令。

--[no-]chain-reply-to

如果设置了此选项,则每封电子邮件都将作为对之前发送的电子邮件的回复发送。如果使用 "--no-chain-reply-to" 禁用,则第一封邮件之后的邮件都将作为对第一封邮件的回复发送。使用此选项时,建议将第一个给定的文件作为整个补丁系列的概述。默认情况下禁用,但可以使用 sendemail.chainReplyTo 配置变量启用它。

--identity=<identity>

一个配置标识。如果给出,则会导致 sendemail.<identity> 子部分中的值优先于 sendemail 部分中的值。默认标识是 sendemail.identity 的值。

--[no-]signed-off-by-cc

如果设置了此选项,则将 Signed-off-by 尾部或 Cc: 行中找到的电子邮件添加到 cc 列表中。默认为 sendemail.signedOffByCc 配置值;如果未指定,则默认为 --signed-off-by-cc。

--[no-]cc-cover

如果设置了此选项,则在系列中的第一个补丁(通常是封面信)的 Cc: 标题中找到的电子邮件将添加到每个电子邮件集的 cc 列表中。默认为 sendemail.ccCover 配置值;如果未指定,则默认为 --no-cc-cover。

--[no-]to-cover

如果设置了此选项,则在系列中的第一个补丁(通常是封面信)的 To: 标题中找到的电子邮件将添加到每个电子邮件集的 to 列表中。默认为 sendemail.toCover 配置值;如果未指定,则默认为 --no-to-cover。

--suppress-cc=<category>

指定一个要抑制自动抄送的额外类别收件人。

  • author 将避免包含补丁作者。

  • self 将避免包含发件人。

  • cc 将避免包含补丁标题中的 Cc 行中提到的任何人,除了自己(使用 self 表示自己)。

  • bodycc 将避免包含补丁正文(提交消息)中的 Cc 行中提到的任何人,除了自己(使用 self 表示自己)。

  • sob 将避免包含 Signed-off-by 尾部中提到的任何人,除了自己(使用 self 表示自己)。

  • misc-by 将避免包含补丁正文中提到的 Acked-by、Reviewed-by、Tested-by 和其他 "-by" 行中提到的任何人,除了 Signed-off-by(使用 sob 表示自己)。

  • cccmd 将避免运行 --cc-cmd。

  • body 等效于 sob + bodycc + misc-by

  • all 将抑制所有自动抄送值。

默认为 sendemail.suppressCc 配置值;如果未指定,则默认为 self(如果指定了 --suppress-from),以及 body(如果指定了 --no-signed-off-cc)。

--[no-]suppress-from

如果设置了此选项,则不会将 From: 地址添加到 cc: 列表中。默认为 sendemail.suppressFrom 配置值;如果未指定,则默认为 --no-suppress-from。

--[no-]thread

如果设置了此选项,则会将 In-Reply-To 和 References 标题添加到发送的每封电子邮件中。每封邮件是引用之前邮件(根据 git format-patch 的说法,是 “深度” 线程),还是引用第一封邮件(“浅层” 线程),这取决于 “--[no-]chain-reply-to”。

如果使用 "--no-thread" 禁用,则不会添加这些标题(除非使用 --in-reply-to 指定)。默认为 sendemail.thread 配置值;如果未指定,则默认为 --thread。

用户需要确保当 git send-email 被要求添加 In-Reply-To 标题时,该标题不存在(尤其要注意 git format-patch 可以被配置为自行执行线程)。否则,可能会在收件人的 MUA 中产生意外的结果。

--[no-]mailmap

使用 mailmap 文件(请参阅 gitmailmap[5])将所有地址映射到其规范的真实姓名和电子邮件地址。可以使用 sendemail.mailmap.filesendemail.mailmap.blob 配置值提供特定于 git-send-email 的其他 mailmap 数据。默认为 sendemail.mailmap

管理

--confirm=<mode>

在发送之前确认

  • always 将始终在发送前确认。

  • never 将永远不会在发送前确认。

  • cc 当 send-email 自动将补丁中的地址添加到 Cc 列表时,将在发送前确认。

  • compose 使用 --compose 时,将在发送第一封邮件之前确认。

  • auto 等同于 cc + compose

默认值为 sendemail.confirm 配置值;如果未指定,则默认值为 auto,除非指定了任何抑制选项,在这种情况下默认值为 compose

--dry-run

执行除实际发送电子邮件以外的所有操作。

--[no-]format-patch

当一个参数可以被理解为引用或文件名时,选择将其理解为 format-patch 参数 (--format-patch) 或文件名 (--no-format-patch)。默认情况下,当发生这种冲突时,git send-email 将失败。

--quiet

使 git-send-email 变得不那么冗长。每封电子邮件一行应该是所有输出。

--[no-]validate

对补丁执行完整性检查。目前,验证意味着以下内容

  • 如果存在,调用 sendemail-validate 钩子(参见 githooks[5])。

  • 警告包含超过 998 个字符的行的补丁,除非使用合适的传输编码(autobase64quoted-printable);这是由于 https://www.ietf.org/rfc/rfc5322.txt 中描述的 SMTP 限制。

默认值为 sendemail.validate;如果未设置,则默认值为 --validate

--force

即使安全检查会阻止,也要发送电子邮件。

信息

--dump-aliases

而不是正常的操作,从配置的别名文件(s)中转储简写别名名称,每行一个,按字母顺序排列。请注意,这仅包含别名名称,不包含其扩展的电子邮件地址。有关别名的更多信息,请参见 sendemail.aliasesFile

--translate-aliases

而不是正常的操作,从标准输入中读取,并将每行解释为电子邮件别名。根据配置的别名文件(s)进行翻译。将每个翻译后的名称和电子邮件地址输出到标准输出,每行一个。有关别名的更多信息,请参见 sendemail.aliasFile

配置

本节中此行以下的所有内容都是从 git-config[1] 文档中选择性地包含的。内容与那里的一样

sendemail.identity

一个配置标识。如果给出,则会导致 sendemail.<identity> 子部分中的值优先于 sendemail 部分中的值。默认标识是 sendemail.identity 的值。

sendemail.smtpEncryption

有关说明,请参见 git-send-email[1]。请注意,此设置不受 identity 机制的影响。

sendemail.smtpSSLCertPath

ca-certificates 的路径(目录或单个文件)。将其设置为空字符串以禁用证书验证。

sendemail.<identity>.*

以下 sendemail.* 参数的标识特定版本,当通过命令行或 sendemail.identity 选择此标识时,优先于这些版本。

sendemail.multiEdit

如果为真(默认),将生成一个单一的编辑器实例来编辑您必须编辑的文件(使用 --annotate 时为补丁,使用 --compose 时为摘要)。如果为假,将依次编辑文件,每次都生成一个新的编辑器。

sendemail.confirm

设置发送前是否确认的默认值。必须是 alwaysnevercccomposeauto 之一。有关这些值的含义,请参见 git-send-email[1] 文档中的 --confirm

sendemail.mailmap

如果为真,则使 git-send-email[1] 假设 --mailmap,否则假设 --no-mailmap。默认情况下为假。

sendemail.mailmap.file

一个 git-send-email[1] 特定的增强型 mailmap 文件的位置。首先加载默认的 mailmap 和 mailmap.file。因此,此文件中的条目优先于默认 mailmap 位置中的条目。参见 gitmailmap[5]

sendemail.mailmap.blob

sendemail.mailmap.file 相似,但将该值视为对存储库中 blob 的引用。sendemail.mailmap.file 中的条目优先于此处的条目。参见 gitmailmap[5]

sendemail.aliasesFile

为了避免键入冗长的电子邮件地址,请将其指向一个或多个电子邮件别名文件。您还必须提供 sendemail.aliasFileType

sendemail.aliasFileType

sendemail.aliasesFile 中指定的文件(s)的格式。必须是 muttmailrcpineelmgnussendmail 之一。

每个格式中的别名文件的外观可以在同名电子邮件程序的文档中找到。下面描述了与标准格式的差异和限制

sendmail
  • 不支持带引号的别名和带引号的地址:包含 " 符号的行将被忽略。

  • 不支持重定向到文件 (/path/name) 或管道 (|command)。

  • 不支持文件包含 (:include: /path/name)。

  • 对于任何明确不支持的结构以及解析器无法识别的任何其他行,都会在标准错误输出上打印警告。

sendemail.annotate
sendemail.bcc
sendemail.cc
sendemail.ccCmd
sendemail.chainReplyTo
sendemail.envelopeSender
sendemail.from
sendemail.headerCmd
sendemail.signedOffByCc
sendemail.smtpPass
sendemail.suppressCc
sendemail.suppressFrom
sendemail.to
sendemail.toCmd
sendemail.smtpDomain
sendemail.smtpServer
sendemail.smtpServerPort
sendemail.smtpServerOption
sendemail.smtpUser
sendemail.thread
sendemail.transferEncoding
sendemail.validate
sendemail.xmailer

这些配置变量都为 git-send-email[1] 命令行选项提供默认值。有关详细信息,请参见其文档。

sendemail.signedOffCc (已弃用)

sendemail.signedOffByCc 的已弃用别名。

sendemail.smtpBatchSize

每次连接要发送的消息数量,之后将重新登录。如果值为 0 或未定义,则在一 次连接中发送所有消息。另请参见 git-send-email[1]--batch-size 选项。

sendemail.smtpReloginDelay

重新连接到 smtp 服务器之前等待的秒数。另请参见 git-send-email[1]--relogin-delay 选项。

sendemail.forbidSendmailVariables

为了避免常见的错误配置,git-send-email[1] 会在存在任何“sendmail”的配置选项时中止并发出警告。设置此变量以绕过检查。

示例

使用 gmail 作为 smtp 服务器

要使用 git send-email 通过 GMail SMTP 服务器发送补丁,请编辑 ~/.gitconfig 以指定您的帐户设置

[sendemail]
	smtpEncryption = tls
	smtpServer = smtp.gmail.com
	smtpUser = [email protected]
	smtpServerPort = 587

如果您在 Gmail 帐户上设置了多因素身份验证,您可以为 git send-email 生成特定于应用程序的密码。访问 https://security.google.com/settings/security/apppasswords 创建它。

准备好将您的提交发送到邮件列表后,运行以下命令

$ git format-patch --cover-letter -M origin/master -o outgoing/
$ edit outgoing/0000-*
$ git send-email outgoing/*

第一次运行时,将提示您输入凭据。输入特定于应用程序的密码或您的常规密码(视情况而定)。如果您配置了凭据助手(参见 git-credential[1]),则密码将保存在凭据存储中,因此您无需在下一次输入。

注意:可能与您的 Perl 发行版一起安装的以下核心 Perl 模块是必需的:MIME::Base64、MIME::QuotedPrint、Net::Domain 和 Net::SMTP。还需要以下附加 Perl 模块:Authen::SASL 和 Mail::Address。

另请参见

GIT

git[1] 套件的一部分

scroll-to-top