如何使用git format-patch格式化邮件补丁?

19

我有一系列的补丁要发送到一个开源项目中,但我不知道如何正确格式化邮件。我尝试运行git format-patch命令,然后将它们全部附加到Thunderbird的邮件中,但它们都被拒绝了,因为每个补丁应该是一个单独的邮件。我想避免使用git email命令,因为我在同一树上有私有代码和需要发送的代码,这意味着我需要在发送之前手动检查每个邮件。

我想继续使用Thunderbird,但似乎存在问题,因为它会换行并使补丁无法使用。我还尝试设置fetchmail和mutt,但经过近10个小时的阅读和尝试之后,我放弃了。是否有一种非fetchmail和非Thunderbird的方法来发送git补丁?


4个回答

13

让我慷慨地贴上Linux项目文档。我不仅仅限制于Thunderbird,因为您的问题标题表明您对一般性感兴趣,而不仅仅是Thunderbird。另外,请检查源代码以获取更新,可能通过此链接进行,因为更新可能不会传播到此答案。

Linux邮件客户端信息

Git

这些天,大多数开发者使用git send-email代替常规的邮件客户端。它的手册非常不错。在接收方面,维护者使用git am来应用补丁。

如果你是git的新手,请将你的第一个补丁发送给自己。将其保存为包含所有标题的原始文本。运行git am raw_email.txt,然后使用git log查看更改日志。当它生效时,请将补丁发送到适当的邮件列表中。

通用偏好设置

Linux内核的补丁通过电子邮件提交,最好作为电子邮件正文中的内联文本。一些维护者接受附件,但是附件应该具有“text/plain”内容类型。但是,附件通常不受欢迎,因为在审核过程中引用补丁部分更加困难。

用于Linux内核补丁的邮件客户端应该发送未经修改的补丁文本。例如,它们不应该修改或删除制表符或空格,甚至不应该在行的开头或结尾处进行修改。

不要发送带有"format=flowed"的补丁。这可能导致意外和不必要的换行。

不要让你的电子邮件客户端为你自动换行。这也可能破坏你的补丁。

邮件客户端不应该修改文本的字符集编码。发送的补丁应该只使用ASCII或UTF-8编码。如果你配置了你的邮件客户端以使用UTF-8编码发送邮件,就可以避免一些可能的字符集问题。

邮件客户端应该生成和维护引用:或In-Reply-To:头,以便邮件线索不会中断。

复制和粘贴通常不能用于补丁,因为制表符会转换为空格。使用xclipboard、xclip和/或xcutsel可能会有所帮助,但最好自己测试一下,或者避免复制和粘贴。

不要在包含补丁的邮件中使用PGP/GPG签名。这会破坏许多读取和应用补丁的脚本。(这应该是可以解决的。)

在将补丁发送到Linux邮件列表之前,向自己发送一个补丁,保存接收到的消息,并成功使用'patch'应用它,这是一个好主意。

一些邮件客户端(MUA)提示

以下是针对编辑和发送Linux内核补丁的特定MUA配置提示。这些不是完整的软件包配置摘要。

图例: TUI = 文本界面 GUI = 图形界面

Alpine (TUI)

配置选项: 在“发送首选项”部分:

  • 必须启用“不要发送流式文本”
  • 必须禁用“发送前剪裁空格”

当编写邮件时,光标应该放在补丁应该出现的位置,然后按CTRL-R让你指定要插入到邮件中的补丁文件。

Claws Mail (GUI)

可以用这个方法成功地打补丁。

要插入一个补丁,请使用消息->插入文件(CTRL+i)或外部编辑器。

如果要在Claws组合窗口中编辑已插入的补丁,“自动换行”在配置->首选项->组合->换行中应该禁用。

Evolution (图形界面)

有些人用这种方法成功地打补丁。

当撰写邮件时,选择:格式->段落样式->预格式化(Ctrl-7)或工具栏中的“预格式化”。

然后使用:

插入->文本文件...(Alt-n x)

来插入补丁。

您还可以使用“diff -Nru old.c new.c | xclip”,选择“预格式化”,然后使用中间按钮粘贴。

Kmail (图形界面)

有些人用Kmail成功地打补丁。

默认设置不需要启用HTML邮件编辑;

在撰写电子邮件时,在选项下取消“自动换行”复选框。唯一的劣势是你在电子邮件中输入的任何文本都不会自动换行,因此你将不得不在修补程序之前手动换行文本。最简单的方法是启用自动换行功能撰写电子邮件,然后将其保存为草稿。从草稿中再次打开时,它现在已经进行了硬性自动换行,您可以取消“自动换行”而不会丢失现有的换行。

在您的电子邮件底部,在插入修补程序之前,请放置常用的修补程序分隔符:三个连字符(---)。

然后从“消息”菜单项中选择插入文件,并选择您的修补程序。作为附加奖励,您可以自定义消息创建工具栏菜单并将“插入文件”图标放在那里。

使composer窗口足够宽,以便没有行会自动换行。截至KMail 1.13.5(KDE 4.5.4),如果在composer窗口中的某些行自动换行,则KMail在发送电子邮件时会应用自动换行。仅在选项菜单中禁用自动换行是不够的。因此,如果您的修补程序具有非常长的行,则必须在发送电子邮件之前将composer窗口设置得非常宽。请参见:https://bugs.kde.org/show_bug.cgi?id=174034

您可以安全地对附件进行GPG签名,但内联文本更适合作为修补程序,因此不要对其进行GPG签名。签署已插入为内联文本的补丁将使它们难以从其7位编码中提取。

如果您绝对必须将修补程序作为附件而不是作为文本行内插入,则右键单击附件并选择属性,然后突出显示“建议自动显示”,以使附件成为内联,使其更易于查看。

保存以内联文本形式发送的修补程序时,请从消息列表窗格中选择包含修补程序的电子邮件,右键单击并选择“另存为”。如果正确组成了电子邮件,则可以直接使用整个电子邮件作为修补程序。目前没有选项可以在单独查看电子邮件时保存邮件——在kmail的bugzilla中提交了请求,希望能解决这个问题。电子邮件被保存为用户可读写,因此您必须对它们进行chmod以使它们在其他地方复制时可以被组和世界读取。

Lotus Notes(GUI)

远离它。

Mutt(TUI)

许多Linux开发人员使用Mutt,因此它一定工作得很好。

Mutt没有自带编辑器,所以无论使用哪个编辑器都应该确保不会自动换行。大多数编辑器都有一个“插入文件”选项,可以将文件内容原样插入。

要在 mutt 中使用 'vim': set editor="vi"

如果使用 xclip,请在按下中间按钮或 shift-insert 或使用 :r filename 命令之前输入以下命令: :set paste

如果想要内联包含补丁, (a)ttach 可以不用 "set paste"。

你也可以使用 'git format-patch' 生成补丁,然后使用 Mutt 发送它们: $ mutt -H 0001-some-bug-fix.patch

配置选项: 默认设置应该可以工作。 但是,最好将 "send_charset" 设置为: set send_charset="us-ascii:utf-8"

Mutt 是高度可定制的。以下是一个最小的配置,用于通过 Gmail 发送补丁:

# .muttrc
# ================  IMAP ====================
set imap_user = 'yourusername@gmail.com'
set imap_pass = 'yourpassword'
set spoolfile = imaps://imap.gmail.com/INBOX
set folder = imaps://imap.gmail.com/
set record="imaps://imap.gmail.com/[Gmail]/Sent Mail"
set postponed="imaps://imap.gmail.com/[Gmail]/Drafts"
set mbox="imaps://imap.gmail.com/[Gmail]/All Mail"

# ================  SMTP  ====================
set smtp_url = "smtp://username@smtp.gmail.com:587/"
set smtp_pass = $imap_pass
set ssl_force_tls = yes # Require encrypted connection

# ================  Composition  ====================
set editor = `echo \$EDITOR`
set edit_headers = yes  # See the headers when editing
set charset = UTF-8     # value of $LANG; also fallback for send_charset
# Sender, email address, and sign-off line must match
unset use_domain        # because joe@localhost is just embarrassing
set realname = "YOUR NAME"
set from = "username@gmail.com"
set use_from = yes

以下是更多关于Mutt的信息: http://dev.mutt.org/trac/wiki/UseCases/Gmail http://dev.mutt.org/doc/manual.html

Pine (TUI)

Pine过去有一些空格截断问题,但现在应该都已经解决了。

如果可以的话,请使用alpine(pine的后继版本)。

配置选项: - 最近版本需要quell-flowed-text - 需要“no-strip-whitespace-before-send”选项

Sylpheed (GUI)

  • 对于内嵌文本(或使用附件)效果良好。
  • 允许使用外部编辑器。
  • 大文件夹处理速度较慢。
  • 不支持在非SSL连接上进行TLS SMTP身份验证。
  • 撰写窗口中有一个有用的标尺栏。
  • 添加地址到地址簿时无法正确识别显示名称。

Thunderbird (GUI)

Thunderbird是一个Outlook克隆版,喜欢搞乱文本,但有办法让它行为正常。

  • 允许使用外部编辑器: 与Thunderbird和补丁一起使用的最简单方法是使用“外部编辑器”扩展,然后只需使用您最喜欢的$EDITOR来阅读/合并补丁到正文中。为此,请下载并安装该扩展,然后使用View->Toolbars->Customize ...添加一个按钮,在Compose对话框中单击它。

    请注意,“外部编辑器”要求您的编辑器不能分叉,换句话说,编辑器必须在关闭之前返回。您可能需要传递其他标志或更改编辑器的设置。特别是如果您使用gvim,则必须通过将“/usr/bin/gvim -f”(如果二进制文件位于/usr/bin中)放入“外部编辑器”设置中的文本编辑器字段来传递-gvim选项。如果您使用其他编辑器,请阅读其手册以了解如何执行此操作。

要使内部编辑器正常工作,请执行以下操作:

  • 编辑Thunderbird配置设置,使其不使用format=flowed。 转到“edit->preferences->advanced->config editor”以打开Thunderbird的注册表编辑器。

  • 将“mailnews.send_plaintext_flowed”设置为“false”

  • 将“mailnews.wraplength”从“72”更改为“0”

  • “View” > “Message Body As” > “Plain Text”

  • “View” > “Character Encoding” > “Unicode (UTF-8)”

TkRat (GUI)

可以使用“插入文件...”或外部编辑器。

Gmail(Web GUI)

无法用于发送补丁程序。

Gmail Web客户端会自动将制表符转换为空格。

同时,它使用CRLF样式的换行符在每78个字符处换行,尽管tab2space问题可以通过外部编辑器解决。

另一个问题是,Gmail会对任何包含非ASCII字符(例如欧洲名字)的消息进行base64编码。


1
现在Linux项目文档的链接已经失效。 最新的URL是:https://www.kernel.org/doc/html/latest/process/email-clients.html截止撰写本文时,最新的URL为:https://www.kernel.org/doc/html/v4.15-rc2/process/email-clients.html - jwatt
1
谢谢!我已经更新了答案,使用了新的URL。 - Frederick Nord
Thunderbird的"View" > "Character Encoding" > "Unicode (UTF-8)"设置已经不存在了,现在需要做些什么呢? - undefined

9

git help format-patch 中有一个名为“MUA-SPECIFIC HINTS”的部分,提到了三种方法,可以使Thunderbird与git配合使用:

  • 使用Toggle Word Wrap插件
  • 配置Thunderbird以避免破坏补丁
  • 或使用外部编辑器

嗯,我的电脑上没有那个部分。我会去查一下谷歌...确实谷歌有它。 - Chris H
第二个选择“配置Thunderbird以不混淆补丁”的方法已经不再适用了,也许是时候转换到Geary了? - knocte

8

通常情况下,您可以将由git format-patch生成的文件拖放到草稿文件夹中。我至少知道这适用于Evolution邮件客户端。


2
我认为 Evolution 存在的问题是它会换行,从而搞乱补丁 :-/ 至少对我来说是这样。 - Frederick Nord

1
如果您正在使用git format-patch,请确保在Git 2.27(2020年第二季度)及以上版本中使用它:"git format-patch"的输出在From:Subject:标题上使用RFC 2047编码来处理非ASCII字母,以便可以直接输入电子邮件程序。现已添加一个新选项以产生原始标题。这样,如果您的电子邮件客户端只理解ASCII,则无需处理编码问题。

请查看提交19d097e(2020年4月8日)由Emma Brooks(``)完成。
(由Junio C Hamano -- gitster --合并于提交f4216e5,2020年4月22日)

format-patch: 教授--no-encode-email-headers

签名:Emma Brooks

当提交主题或作者包含非ASCII字符时,git format-patch会对它们进行Q编码以便安全地通过电子邮件发送。

但是,如果补丁传输方法不是电子邮件(Web审查工具、Sneakernet等),这只会使补丁元数据更难以阅读,除非您能在脑中解码RFC 2047。

git am以及一些电子邮件软件支持描述在RFC 6531中的非Q编码邮件。

添加--[no-]encode-email-headersformat.encodeEmailHeaders以让用户控制此行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接