简体中文 ▾ 主题 ▾ 最新版本 ▾ git-send-email 上次更新于 2.55.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: 值,第二行作为邮件的 Subject:(主题)。

选项

撰写

--annotate

在发送前审查并编辑每个补丁。默认值为 sendemail.annotate 的值。有关 sendemail.multiEdit,请参阅“配置”(CONFIGURATION)部分。

--bcc=<address>,…​

为每封电子邮件指定一个 Bcc:(密送)值。默认值为 sendemail.bcc 的值。

该选项可以指定多次。

--cc=<address>,…​

为每封电子邮件指定一个起始的 Cc:(抄送)值。默认值为 sendemail.cc 的值。

该选项可以指定多次。

--compose

调用文本编辑器(参见 git-var[1] 中的 GIT_EDITOR)来编辑补丁系列的引导说明邮件(cover letter)。

当使用 --compose 时,git send-email 将使用邮件中指定的 FromToCcBccSubjectReply-ToIn-Reply-To 头部。如果邮件正文(在头部和空行之后输入的内容)仅包含空行(或以 Git: 为前缀的行),则不会发送摘要,但除非删除,否则仍会使用上述提及的头部。

如果缺少 FromIn-Reply-To 头部,系统将进行提示。

有关 sendemail.multiEdit,请参阅“配置”(CONFIGURATION)部分。

--from=<address>

指定电子邮件的发件人。如果未在命令行中指定,则使用 sendemail.from 配置选项的值。如果命令行选项和 sendemail.from 均未设置,系统将提示用户输入该值。提示的默认值将是 git var -l 返回的 GIT_AUTHOR_IDENT 值,如果未设置,则为 GIT_COMMITTER_IDENT

--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,系统将提示输入此值。

--outlook-id-fix
--no-outlook-id-fix

Microsoft Outlook SMTP 服务器会丢弃通过电子邮件发送的 Message-ID 并分配一个新的随机 Message-ID,从而打断了线程(邮件往来关系)。

使用 --outlook-id-fixgit send-email 会使用针对 Outlook 服务器的特定机制来获取服务器分配的 Message-ID,以修复线程关系。仅当您确定服务器报告重写 Message-ID 的方式与 Outlook 服务器相同选项时,才使用此选项。

如果未指定此选项,则在与 smtp.office365.comsmtp-mail.outlook.com 通信时默认会进行此修复。即使与这两个服务器通信,也可以使用 --no-outlook-id-fix 来禁用此功能。

--subject=<string>

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

--to=<address>,…​

指定生成的电子邮件的主要收件人。通常,这将是相关项目的上游维护者。默认值为 sendemail.to 配置值;如果该值未指定且未指定 --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 在仓库中包含含有回车符(CR)的文件时会很有用,但这会使原始补丁邮件文件(如从 MUA 保存的文件)更难进行手动检查。base64 更加万无一失,但可读性也更差。auto 将在可能时使用 8bit,否则使用 quoted-printable

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

--xmailer
--no-xmailer

添加(or 阻止添加)X-Mailer: 头部。默认情况下会添加此头部,但可以通过将 sendemail.xmailer 配置变量设置为 false 来关闭。

发送

--envelope-sender=<address>

指定用于发送电子邮件的发件人信封(envelope sender)。如果您的默认地址不是订阅邮件列表的地址,这会很有用。如需使用 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 command 时使用的完全限定域名(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[1] 获取密码。

--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,但也可以监听 submission 端口 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 <path>

用于 SMTP SSL/TLS 证书验证的受信任 CA 证书存储库的路径(可以是一个已经过 c_rehash 处理的目录,或者是一个包含一个或多个拼接在一起的 PEM 格式证书的单个文件:有关这些的更多信息,请参见 https://docs.openssl.org/master/man1/openssl-verify/ [OpenSSL 的 verify(1) 手册页] 中关于 -CAfile <file>-CApath <dir> 选项的描述)。将其设置为空字符串可禁用证书验证。默认值为 sendemail.smtpSSLCertPath 配置变量的值(如果已设置),否则为底层的 SSL 库编译时默认值(这在大多数平台上通常是最佳选择)。

--smtp-ssl-client-cert <path>

如果服务器有要求,则展示的客户端证书文件的路径。当服务器设置为验证客户端证书时,需要使用此选项。如果文件中不包含相应的私钥,则必须使用 sendemail.smtpSSLClientKey 配置变量或 --smtp-ssl-client-key 选项来提供私钥。默认值为 sendemail.smtpSSLClientCert 配置变量的值(如果已设置)。

--smtp-ssl-client-key <path>

与客户端证书对应的客户端私钥文件的路径。为了避免配置错误,此选项必须与 sendemail.smtpSSLClientKey 配置变量或 --smtp-ssl-client-cert 选项结合使用。如果客户端密钥包含在客户端证书中,则私钥的选择取决于证书的格式。访问 https://metacpan.org/pod/IO::Socket::SSL 了解更多详情。默认值为 sendemail.smtpSSLClientKey 配置变量的值(如果已设置)。

--smtp-user=<user>

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

--smtp-debug=(0|1)

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

--imap-sent-folder=<folder>

某些电子邮件服务商(例如 iCloud)不会将使用 SMTP 发送的电子邮件副本发送到您邮箱中的 Sent(已发送)或类似文件夹。使用此选项可通过 git imap-send 将电子邮件副本发送到使用此选项指定的文件夹。您可以运行 git imap-send --list 来获取有效文件夹名称列表,包括您邮箱中 Sent 文件夹的正确名称。您也可以使用此选项将电子邮件发送到您选择的专用 IMAP 文件夹中。

此功能需要设置 git imap-send。请参见 git-imap-send[1] 以获取相关说明。

--use-imap-only
--no-use-imap-only

如果设置了此选项,所有的电子邮件将仅被复制到通过 --imap-sent-foldersendemail.imapSentFolder 指定的 IMAP 文件夹中,而不会发送给收件人。如果您只想创建电子邮件草稿,并使用另一个电子邮件客户端来发送它们,这会很有用。如果通过 --no-use-imap-only 禁用此选项,电子邮件将照常发送。默认情况下处于禁用状态,但可以使用 sendemail.useImapOnly 配置变量来启用它。

此功能需要设置 git imap-send。请参见 git-imap-send[1] 以获取相关说明。

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

禁用任何正在使用的头部命令。

--chain-reply-to
--no-chain-reply-to

如果设置了此选项,每封电子邮件都将作为对上一封已发送电子邮件的回复来发送。如果通过 --no-chain-reply-to 禁用,第一封之后的全部电子邮件都将作为对第一封发送的电子邮件的回复。使用此选项时,建议给出的第一个文件是整个补丁系列的概述。默认处于禁用状态,但可以使用 sendemail.chainReplyTo 配置变量来启用它。

--identity=<identity>

配置标识。指定后,会让 sendemail.<identity> 子部分中的值优先于 sendemail 部分中的值。默认标识是 sendemail.identity 的值。

--signed-off-by-cc
--no-signed-off-by-cc

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

--cc-cover
--no-cc-cover

如果设置了此选项,在该系列的第一封补丁(通常是引导说明邮件 cover letter)的 Cc: 头部中找到的电子邮件地址,将被添加到该系列中发送的每封邮件的抄送列表中。默认值为 sendemail.ccCover 配置值;如果未指定该值,则默认使用 --no-cc-cover

--to-cover
--no-to-cover

如果设置了此选项,在该系列的第一封补丁(通常是引导说明邮件 cover letter)的 To: 头部中找到的电子邮件地址,将被添加到该系列中发送的每封邮件的收件人列表中。默认值为 sendemail.toCover 配置值;如果未指定该值,则默认使用 --no-to-cover

--suppress-cc=<category>

指定一个额外的收件人类别,以阻止其自动抄送:

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

  • self will 将避免包含发件人。

  • 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 配置值;如果未指定,当指定了 --suppress-from 时默认使用 self,以及当指定了 --no-signed-off-by-cc 时默认使用 body

--suppress-from
--no-suppress-from

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

--thread
--no-thread

如果设置了此选项,In-Reply-ToReferences 头部将被添加到发送的每封电子邮件中。每封邮件是指向上一封电子邮件(根据 git format-patch 的措辞为“深级(deep)”线程关系)还是指向第一封电子邮件(“浅级(shallow)”线程关系),由 --[no-]chain-reply-to 决定。

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

在要求 git send-email 添加 In-Reply-To 头部时,用户需自行确保不存在该头部(特别是要注意 git format-patch 可以配置为自行处理线程)。如果不注意这一点,可能无法在收件人的 MUA(邮件用户代理)中产生预期的效果。

--mailmap
--no-mailmap

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

管理

--confirm=<mode>

在发送前进行确认

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

  • never 在发送前绝不确认。

  • cc 将在 send-email 自动从补丁中添加地址到抄送列表时,在发送前进行确认。

  • compose 将在使用 --compose 发送第一封邮件前进行确认。

  • auto 相当于 cc + compose

默认值为 sendemail.confirm 配置值;如果未指定该值,则除非指定了任何阻止(suppress)选项(在这种情况下默认使用 compose),否则默认使用 auto

--dry-run

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

--format-patch
--no-format-patch

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

--quiet

减少 git send-email 的输出。输出应该仅为每封电子邮件一行。

--validate
--no-validate

对补丁执行健全性检查。目前,验证意味着以下操作:

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

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

默认值为 sendemail.validate 的值;如果未设置此项,则默认使用 --validate

--force

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

信息

--dump-aliases

不执行普通操作,而是从配置的别名文件中转储别名简称,按字母顺序每行一个。请注意,这仅包含别名,而不包含其展开后的电子邮件地址。有关别名的更多信息,请参阅 sendemail.aliasesFile

--translate-aliases

不执行普通操作,而是从标准输入读取并将每一行解析为一个电子邮件别名。根据配置的别名文件对其进行转换。将转换后的每个姓名和电子邮件地址输出到标准输出,每行一个。有关别名的更多信息,请参阅 sendemail.aliasFile

配置

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

sendemail.identity

配置标识。指定后,会让 sendemail.<identity> 子部分中的值优先于 sendemail 部分中的值。默认标识是 sendemail.identity 的值。

sendemail.smtpEncryption

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

sendemail.smtpSSLCertPath

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

sendemail.smtpSSLClientCert

如果服务器有要求,则展示的客户端证书文件的路径。当服务器设置为验证客户端证书时,需要此项。如果文件中不包含相应的私钥,则必须使用 sendemail.smtpSSLClientKey--smtp-ssl-client-key 选项来提供。

sendemail.smtpSSLClientKey

与客户端证书相对应的客户端私钥文件的路径。为了避免配置错误,此配置必须与 sendemail.smtpSSLClientCert--smtp-ssl-client-cert 选项结合使用。如果客户端密钥已包含在客户端证书中,则私钥的选择取决于证书的格式。访问 https://metacpan.org/pod/IO::Socket::SSL 了解更多详情。

sendemail.<identity>.*

针对特定标识的下面 sendemail.* 参数版本。当通过命令行或 sendemail.identity 选择该标识时,这些版本将优先于普通配置的值。

sendemail.multiEdit

如果是 true(默认值),将启动单个编辑器实例来编辑您必须编辑的文件(使用 --annotate 时的补丁,以及使用 --compose 时的摘要)。如果是 false,文件将一个接一个地进行编辑,每次都会启动一个新的编辑器。

sendemail.confirm

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

sendemail.mailmap

如果为 true,则使 git-send-email[1] 假定使用 --mailmap,否则假定使用 --no-mailmap。默认为 False

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 中指定的文件格式。必须是 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.imapSentFolder
sendemail.useImapOnly
sendemail.thread
sendemail.transferEncoding
sendemail.validate
sendemail.xmailer

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

sendemail.outlookidfix

如果为 true,则使 git-send-email[1] 默认使用 --outlook-id-fix;如果为 false,则默认使用 --no-outlook-id-fix。如果未指定,其行为将与未指定 --outlook-id-fix 时相同。

sendemail.signedOffCc (已弃用)

用于 sendemail.signedOffByCc 的弃用别名。

sendemail.smtpBatchSize

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

sendemail.smtpReloginDelay

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

sendemail.forbidSendmailVariables

为了避免常见的配置错误,如果存在任何针对 sendmail 的配置选项,git-send-email[1] 将终止运行并发出警告。设置此变量可绕过该检查。

SMTP 服务器示例

使用 Gmail 作为 SMTP 服务器

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

[sendemail]
	smtpEncryption = ssl
	smtpServer = smtp.gmail.com
	smtpUser = yourname@gmail.com
	smtpServerPort = 465

Gmail 不允许在 git send-email 中使用您的常规密码。如果您的 Gmail 账户设置了多重身份验证,您可以生成一个专用应用密码,以供 git send-email 使用。访问 https://security.google.com/settings/security/apppasswords 来创建它。

或者,您也可以在 Gmail 中使用 OAuth2.0 身份验证,而不是使用应用专用密码。OAuth2.0 比应用专用密码更安全,且无论您是否设置了多重身份验证都可以使用。OAUTHBEARERXOAUTH2 是用于此类身份验证的常用机制。Gmail 对这两者都支持。例如,如果您想使用 OAUTHBEARER,请编辑您的 ~/.gitconfig 文件,并在您的账户设置中添加 smtpAuth = OAUTHBEARER

[sendemail]
	smtpEncryption = ssl
	smtpServer = smtp.gmail.com
	smtpUser = yourname@gmail.com
	smtpServerPort = 465
	smtpAuth = OAUTHBEARER

另一个选择是使用由 Google 开发的名为 sendgmail 的工具来通过 git send-email 发送电子邮件。

使用 Microsoft Outlook 作为 SMTP 服务器

与 Gmail 不同,Microsoft Outlook 不再支持应用专用密码。因此,在 Outlook 中必须使用 OAuth2.0 身份验证。此外,它仅支持 XOAUTH2 身份验证机制。

编辑 ~/.gitconfig 以指定 Outlook 的账户设置,以便在 git send-email 中使用其 SMTP 服务器:

[sendemail]
	smtpEncryption = tls
	smtpServer = smtp.office365.com
	smtpUser = yourname@outlook.com
	smtpServerPort = 587
	smtpAuth = XOAUTH2

发送补丁

一旦您的提交准备好发送到邮件列表,请运行以下命令:

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

首次运行时,系统会提示您输入凭证。请根据情况输入应用专用密码或您的常规密码。

如果您配置了凭据助手(参见 git-credential[1]),密码将保存到凭据库中,这样您下次就不用再手动输入了。

如果您使用的是 OAuth2.0 身份验证,在提示输入密码时,您需要使用访问令牌(access token)代替。网上有各种 OAuth2.0 令牌生成器,也有社区维护的凭证助手可用:

您还可以参阅 gitcredentials[7] 了解更多基于 OAuth 的身份验证助手。

Proton Mail 不提供发送电子邮件的 SMTP 服务器。如果您是 Proton Mail 的付费客户,可以使用 Proton Mail 官方提供的 Proton Mail Bridge 来创建本地 SMTP 服务器以发送电子邮件。对于免费和付费用户,也可以使用类似 git-protonmail 这样的社区维护项目。

注意:需要以下可能随您的 Perl 发行版一起安装的 core Perl 模块:

还需要以下附加 Perl 模块:

利用 git send-emailsendmailCmd 选项

除了通过 SMTP 服务器发送电子邮件外,git send-email 还可以通过任何支持类似 sendmail 命令的应用程序发送电子邮件。您可以阅读上面关于 --sendmail-cmd=<command> 的文档以获取更多信息。如果您想使用另一个应用程序作为 git send-email 的 SMTP 客户端,或者如果您的电子邮件服务商使用专有 API 而非 SMTP 来发送电子邮件,则此功能非常有用。

作为示例,让我们看看如何配置 msmtp(一个在许多 Linux 发行版中常见的流行 SMTP 客户端)。编辑 ~/.gitconfig 以指示 git-send-email 使用它来发送电子邮件。

[sendemail]
	sendmailCmd = /usr/bin/msmtp # Change this to the path where msmtp is installed

此类社区维护的一些助手程序的链接如下:

  • msmtp(具有众多功能的流行 SMTP 客户端,可用于 Linux 和 macOS)

  • git-protonmail(一个可以使用 ProtonMail API 发送电子邮件的跨平台客户端)

  • git-msgraph(一个可以使用 Microsoft Graph API 发送电子邮件的跨平台客户端)

注意事项

来自 git-format-patch[1] 的输出在使用 git-am[1] 应用时可能会产生不同的提交信息。应用的补丁也可能与生成的补丁不同,或者可能直接应用失败。

任何格式如下的行:

  • 三个短横线和行尾,或者

  • diff - 开头的行,或

  • 以 `Index: ` 开头的行

的行都被视为补丁的开始,并且提交日志信息会在第一次出现此类行之前终止。

请注意,这对于提交信息中出现的未缩进 diff 尤其成问题;提交信息中的 diff 可能会与补丁部分一起被应用,或者补丁应用机制可能会因为补丁目标无法应用而绊倒。这例如可能是由 Markdown 代码块中的 diff 引起的。

解决此问题的办法是缩进 diff 或可能引起问题的其他文本。

如果您直接从邮箱应用补丁,这种保真度损失可能很容易察觉。然而,源自 Git 的更改可以批量应用,在这种情况下,这将很难察觉。这例如可以是一个使用补丁文件在来自上游仓库的提交之上应用更改的 Linux 发行版。这表明此行为不仅影响电子邮件工作流。

考虑到这些限制,人们可能会倾向于使用像 patch(1) 这样的通用工具。然而,patch(1) 不仅会寻找未缩进的 diff(类似于 git-am[1]),还会尝试应用缩进的 diff。

另请参阅

GIT

Git[1] 套件的一部分