Skip to content

git-format-patch

为电子邮件提交准备补丁

概要

'git format-patch' [-k] [(-o|--output-directory) <dir> | --stdout]
		   [--no-thread | --thread[=<style>]]
		   [(--attach|--inline)[=<boundary>] | --no-attach]
		   [-s | --signoff]
		   [--signature=<signature> | --no-signature]
		   [--signature-file=<file>]
		   [-n | --numbered | -N | --no-numbered]
		   [--start-number <n>] [--numbered-files]
		   [--in-reply-to=<message-id>] [--suffix=.<sfx>]
		   [--ignore-if-in-upstream] [--always]
		   [--cover-from-description=<mode>]
		   [--rfc[=<rfc>]] [--subject-prefix=<subject-prefix>]
		   [(--reroll-count|-v) <n>]
		   [--to=<email>] [--cc=<email>]
		   [--[no-]cover-letter] [--quiet]
		   [--commit-list-format=<format-spec>]
		   [--[no-]encode-email-headers]
		   [--no-notes | --notes[=<ref>]]
		   [--interdiff=<previous>]
		   [--range-diff=<previous> [--creation-factor=<percent>]]
		   [--filename-max-length=<n>]
		   [--progress]
		   [<common-diff-options>]
		   [ <since> | <revision-range> ]

描述

为每个非合并提交准备其"补丁",每个提交一个"消息",格式化为类似 UNIX 邮箱。此命令的输出方便电子邮件提交或与 'git am' 一起使用。

命令生成的"消息"由三部分组成:

  • From <commit> 开头的简短元数据头,带有固定的 Mon Sep 17 00:00:00 2001 时间戳,以帮助 "file(1)" 等程序识别该文件是此命令的输出,记录作者身份、作者日期和更改标题(取自提交日志消息的第一段)的字段。

  • 提交日志消息的第二段及后续段。

  • "补丁",即提交与其父提交之间的 "diff -p --stat" 输出(参见 git-diff(1))。

日志消息和补丁由三条破折号的行分隔。

有两种方法指定要操作的提交。

  1. 单个提交 <since>,指定要输出的不在导致 <since> 的历史中的、通向当前分支顶端的提交。

  2. 通用 <revision-range> 表达式(参见 gitrevisions(7) 中的"指定修订"部分)表示指定范围内的提交。

在单个 <commit> 的情况下,第一条规则优先。要应用第二条规则,即格式化从历史开始到 <commit> 的所有内容,请使用 --root 选项:git format-patch --root <commit>。如果您只想格式化 <commit> 本身,可以使用 git format-patch -1 <commit>

默认情况下,每个输出文件从 1 开始顺序编号,并使用提交消息的第一行(经过路径名安全处理)作为文件名。使用 --numbered-files 选项时,输出文件名将只是数字,不附加提交的第一行。输出文件的名称打印到标准输出,除非指定了 --stdout 选项。

如果指定了 -o,输出文件在 <dir> 中创建。否则在当前工作目录中创建。默认路径可以通过 format.outputDirectory 配置选项设置。-o 选项优先于 format.outputDirectory。要将补丁存储在当前工作目录中,即使 format.outputDirectory 指向其他位置,请使用 -o .。将创建所有目录组件。

默认情况下,单个补丁的主题是 "[PATCH] " 后跟提交消息中直到第一个空行的行的连接(参见 git-commit(1) 的讨论部分)。

当输出多个补丁时,主题前缀将改为 "[PATCH n/m] "。要强制为单个补丁添加 1/1,请使用 -n。要从主题中省略补丁编号,请使用 -N

如果给出 --threadgit-format-patch 将生成 In-Reply-ToReferences 头,使第二个及后续的补丁邮件显示为第一个邮件的回复;这还生成一个 Message-ID 头以供引用。

选项

  • -p, --no-stat - 生成不带任何 diffstat 的纯补丁。

  • -U<n>, --unified=<n> - 生成带有 <n> 行上下文的差异。上下文行数默认为 diff.context 或 3(如果配置变量未设置)。

  • --output=<file> - 输出到特定文件而不是 stdout。

  • --output-indicator-new=<char>, --output-indicator-old=<char>, --output-indicator-context=<char> - 指定在生成的补丁中用于指示新旧行或上下文行的字符。通常它们分别是 +- 和 ' '。

  • --indent-heuristic - 启用启发式方法,移动差异块边界以使补丁更易读。这是默认行为。

  • --no-indent-heuristic - 禁用缩进启发式。

  • --minimal - 花费额外时间以确保产生尽可能小的差异。

  • --patience - 使用 "patience diff" 算法生成差异。

  • --histogram - 使用 "histogram diff" 算法生成差异。

  • --anchored=<text> - 使用 "anchored diff" 算法生成差异。此选项可以指定多次。如果某行在源和目标中都存在,仅存在一次,并以 <text> 开头,此算法尝试防止它在输出中显示为删除或添加。内部使用 "patience diff" 算法。

  • --diff-algorithm=(patience|minimal|histogram|myers) - 选择差异算法。变体如下:

    • default, myers:基本的贪婪差异算法。目前这是默认值。
    • minimal:花费额外时间以确保产生尽可能小的差异。
    • patience:生成补丁时使用 "patience diff" 算法。
    • histogram:此算法将 patience 算法扩展为"支持低出现率的公共元素"。
  • --stat[=<width>[,<name-width>[,<count>]]] - 生成 diffstat。默认情况下,文件名部分使用尽可能多的空间,其余用于图形部分。最大宽度默认为终端宽度,或 80 列(如果未连接到终端),可以通过 <width> 覆盖。文件名部分的宽度可以通过在逗号后给出另一个宽度 <name-width> 或设置 diff.statNameWidth=<name-width> 来限制。图形部分的宽度可以通过使用 --stat-graph-width=<graph-width> 或设置 diff.statGraphWidth=<graph-width> 来限制。

  • --compact-summary - 在 diffstat 中输出扩展头信息的紧凑摘要,如文件创建或删除("new" 或 "gone",如果是符号链接则可选 +l)和模式更改(分别为添加或删除可执行位的 +x-x)。信息放在文件名部分和图形部分之间。隐含 --stat

  • --numstat - 类似于 --stat,但以十进制表示法显示添加和删除的行数,路径名不缩写,使其更易于机器处理。对于二进制文件,输出两个 - 而不是 0 0

  • --shortstat - 仅输出 --stat 格式的最后一行,包含修改的文件总数以及添加和删除的行数。

  • -X [<param>,...], --dirstat[=<param>,...] - 输出每个子目录的相对更改量分布。--dirstat 的行为可以通过传递逗号分隔的参数列表来自定义。默认由 diff.dirstat 配置变量控制(参见 git-config(1))。可用参数如下:

    • changes:通过计算从源删除或添加到目标的行数来计算 dirstat 数字。这忽略了文件内纯代码移动的量。
    • lines:通过执行常规的基于行的差异分析并对删除/添加的行数求和来计算 dirstat 数字。
    • files:通过计算更改的文件数来计算 dirstat 数字。每个更改的文件在 dirstat 分析中同等计数。
    • cumulative:子目录中的更改也计入父目录。
    • <limit>:整数参数指定截止百分比(默认 3%)。贡献少于此百分比更改的目录不会在输出中显示。
  • --cumulative - --dirstat=cumulative 的同义词。

  • --dirstat-by-file[=<param>,...] - --dirstat=files,<param>,... 的同义词。

  • --summary - 输出扩展头信息(如创建、重命名和模式更改)的紧凑摘要。

  • -z - 用 NUL 而不是换行符分隔提交。此外,当给出 --raw--numstat 时,不修改路径名并使用 NUL 作为输出字段终止符。没有此选项时,带有"异常"字符的路径名按配置变量 core.quotePath(参见 git-config(1))所述进行引用。

  • --name-only - 仅在后映像树中显示每个更改文件的名称。文件名通常以 UTF-8 编码。

  • --name-status - 仅显示每个更改文件的名称和状态。有关状态字母的含义,请参阅 --diff-filter 选项的描述。

  • --submodule[=<format>] - 指定如何显示子模块中的差异。指定 --submodule=short 时使用 short 格式。指定 --submodule--submodule=log 时使用 log 格式。指定 --submodule=diff 时使用 diff 格式。默认为 diff.submoduleshort 格式(如果配置选项未设置)。

  • --color[=<when>] - 显示彩色差异。--color(即不带 =<when>)与 --color=always 相同。<when> 可以是 alwaysneverauto 之一。

  • --no-color - 关闭彩色差异。与 --color=never 相同。

  • --color-moved[=<mode>] - 移动的代码行以不同颜色显示。<mode> 默认为 no(如果未给出选项)和 zebra(如果给出不带模式的选项)。模式必须是以下之一:

    • no:不突出显示移动的行。
    • defaultzebra 的同义词。
    • plain:在某个位置添加并在另一个位置删除的任何行将用 color.diff.newMoved 着色。
    • blocks:贪婪检测至少 20 个字母数字字符的移动文本块。
    • zebra:以 blocks 模式检测移动的文本块。块使用 color.diff.(old|new)Moved 颜色或 color.diff.(old|new)MovedAlternative 着色。
    • dimmed-zebra:类似于 zebra,但对移动代码的不感兴趣部分执行额外调暗。
  • --no-color-moved - 关闭移动检测。与 --color-moved=no 相同。

  • --color-moved-ws=<mode>,... - 配置在执行 --color-moved 的移动检测时如何忽略空格。模式可以作为逗号分隔的列表给出:

    • no:执行移动检测时不忽略空格。
    • ignore-space-at-eol:忽略行尾空格的更改。
    • ignore-space-change:忽略空格量的更改。
    • ignore-all-space:比较行时忽略空格。
    • allow-indentation-change:最初忽略移动检测中的任何空格,然后仅在每行空格更改相同时将移动的代码块分组为一个块。
  • --no-color-moved-ws - 执行移动检测时不忽略空格。与 --color-moved-ws=no 相同。

  • --word-diff[=<mode>] - 默认情况下,单词由空格分隔。<mode> 默认为 plain,必须是以下之一:

    • color:仅使用颜色突出显示更改的单词。隐含 --color
    • plain:将单词显示为 ++[-removed-]++ 和 ++{+added+}++。
    • porcelain:使用面向脚本消费的特殊基于行的格式。
    • none:再次禁用单词差异。
  • --word-diff-regex=<regex> - 使用 <regex> 来决定什么是单词,而不是将非空白字符的序列视为一个单词。还隐含 --word-diff(除非它已被启用)。

  • --color-words[=<regex>] - 等同于 --word-diff=color 加上(如果指定了正则表达式)--word-diff-regex=<regex>

  • --no-renames - 关闭重命名检测,即使配置文件给出默认执行。

  • --rename-empty, --no-rename-empty - 是否使用空 blob 作为重命名源。

  • --full-index - 在生成补丁格式输出时,在 "index" 行上显示完整的前映像和后映像 blob 对象名称,而不是前几个字符。

  • --binary - 除了 --full-index,还输出可以用 git-apply 应用的二进制差异。隐含 --patch

  • --abbrev[=<n>] - 在 diff-raw 格式输出和 diff-tree 头行中显示最短的唯一引用对象的至少 <n> 位十六进制数字的前缀,而不是完整的 40 字节十六进制对象名称。

  • -B[<n>][/<m>], --break-rewrites[=[<n>][/<m>]] - 将完整的重写更改分成删除和创建对。这有两个目的: 它影响将总计完全重写文件的更改视为单个删除所有旧内容后跟单个插入所有新内容的方式,而不是一系列删除和插入混合在一起的少数几行文本上匹配的行作为上下文。数字 <m> 控制 -B 选项的此方面(默认为 60%)。-B/70% 指定原始内容中少于 30% 保留在结果中时,Git 才将其视为完全重写。 与 -M 一起使用时,完全重写的文件也被视为重命名的源(通常 -M 仅将消失的文件视为重命名的源),数字 <n> 控制 -B 选项的此方面(默认为 50%)。-B20% 指定与文件大小 20% 或更多的添加和删除相比的更改有资格被选为另一个文件的可能重命名源。

  • -M[<n>], --find-renames[=<n>] - 检测重命名。如果指定了 <n>,它是相似性索引(即与文件大小相比的添加/删除量)的阈值。例如,-M90% 表示如果超过 90% 的文件未更改,Git 应将删除/添加对视为重命名。没有 % 号时,数字读作分数,前面有小数点。默认相似性索引为 50%。

  • -C[<n>], --find-copies[=<n>] - 检测副本以及重命名。另请参阅 --find-copies-harder。如果指定了 <n>,它与 -M<n> 含义相同。

  • --find-copies-harder - 出于性能原因,默认情况下 -C 选项仅在副本的原始文件在同一更改集中被修改时才查找副本。此标志使命令检查未修改的文件作为副本源的候选。对于大型项目,这是非常昂贵的操作,因此请谨慎使用。

  • -D, --irreversible-delete - 省略删除的前映像,即仅打印头但不打印前映像与 /dev/null 之间的差异。生成的补丁不打算用 patchgit apply 应用;这仅适用于只想专注于审查更改后文本的人。

  • -l<num> - -M-C 选项涉及一些初步步骤,可以廉价地检测重命名/副本的子集,然后是详尽的回退部分,将所有剩余未配对的目标与所有相关源进行比较。此选项防止在涉及的源/目标文件数超过指定数量时运行详尽的重命名/副本检测部分。默认为 diff.renameLimit。请注意,值 0 被视为无限制。

  • -O<orderfile> - 控制文件在输出中出现的顺序。这覆盖 diff.orderFile 配置变量(参见 git-config(1))。输出顺序由 <orderfile> 中 glob 模式的顺序决定。与第一个模式匹配的所有路径名首先输出,与第二个模式匹配(但不与第一个匹配)的下一个输出,依此类推。与任何模式都不匹配的所有路径名最后输出。

  • --skip-to=<file>, --rotate-to=<file> - 从输出中丢弃命名 <file> 之前的文件(即"跳转到"),或将其移动到输出末尾(即"轮转到")。

  • -R - 交换两个输入;即显示从索引或磁盘文件到树内容的差异。

  • --relative[=<path>], --no-relative - 从项目的子目录运行时,可以告诉它排除目录之外的更改并显示相对于它的路径名。--no-relative 可用于取消 diff.relative 配置选项和先前的 --relative

  • -a, --text - 将所有文件视为文本。

  • --ignore-cr-at-eol - 比较时忽略行尾的回车符。

  • --ignore-space-at-eol - 忽略行尾空格的更改。

  • -b, --ignore-space-change - 忽略空格量的更改。

  • -w, --ignore-all-space - 比较行时忽略空格。

  • --ignore-blank-lines - 忽略所有行为空的更改。

  • -I<regex>, --ignore-matching-lines=<regex> - 忽略所有行匹配 <regex> 的更改。此选项可以指定多次。

  • --inter-hunk-context=<number> - 显示差异块之间的上下文,最多指定的 <number> 行,从而融合彼此接近的块。默认为 diff.interHunkContext 或 0(如果配置选项未设置)。

  • -W, --function-context - 将整个函数显示为每个更改的上下文行。函数名称的确定方式与 git diff 确定补丁块头的方式相同(参见 gitattributes(5) 中的"定义自定义块头")。

  • --ext-diff - 允许执行外部差异辅助程序。如果您使用 gitattributes(5) 设置了外部差异驱动程序,则需要将此选项与 git-log(1) 等一起使用。

  • --no-ext-diff - 禁止外部差异驱动程序。

  • --textconv, --no-textconv - 允许(或禁止)在比较二进制文件时运行外部文本转换过滤器。

  • --ignore-submodules[=(none|untracked|dirty|all)] - 在差异生成中忽略子模块的更改。all 是默认值。

  • --src-prefix=<prefix> - 显示给定的源 <prefix> 而不是 "a/"。

  • --dst-prefix=<prefix> - 显示给定的目标 <prefix> 而不是 "b/"。

  • --no-prefix - 不显示任何源或目标前缀。

  • --default-prefix - 使用默认的源和目标前缀("a/" 和 "b/")。这覆盖诸如 format.noprefixdiff.srcPrefixdiff.dstPrefixdiff.mnemonicPrefix 等配置变量(参见 git-config(1))。

  • --line-prefix=<prefix> - 在每行输出前加上额外的 <prefix>

  • --ita-invisible-in-index - 默认情况下,git add -N 添加的条目在 git diff 中显示为现有空文件,在 git diff --cached 中显示为新文件。此选项使条目在 git diff 中显示为新文件,在 git diff --cached 中不存在。

  • --max-depth=<depth> - 对于命令行上给出的每个 pathspec,最多下降 <depth> 层目录。值 -1 表示无限制。不能与 pathspec 中的通配符组合使用。

  • -<n> - 从最顶部的 <n> 个提交准备补丁。

  • -o <dir>, --output-directory <dir> - 使用 <dir> 存储结果文件,而不是当前工作目录。

  • -n, --numbered - 即使是单个补丁,也以 '[PATCH n/m]' 格式命名输出。

  • -N, --no-numbered - 以 '[PATCH]' 格式命名输出。

  • --start-number <n> - 从 <n> 而不是 1 开始对补丁编号。

  • --numbered-files - 输出文件名将是没有附加默认提交第一行的简单数字序列。

  • -k, --keep-subject - 不从提交日志消息的第一行去除/添加 '[PATCH]'。

  • -s, --signoff - 在提交消息中添加 Signed-off-by 尾部,使用您自己的提交者身份。有关更多信息,请参阅 git-commit(1) 中的签名选项。

  • --stdout - 以 mbox 格式将所有提交打印到标准输出,而不是为每个提交创建文件。

  • --attach[=<boundary>] - 创建 multipart/mixed 附件,第一部分是提交消息,第二部分是补丁本身,带有 Content-Disposition: attachment

  • --no-attach - 禁用创建附件,覆盖配置设置。

  • --inline[=<boundary>] - 创建 multipart/mixed 附件,第一部分是提交消息,第二部分是补丁本身,带有 Content-Disposition: inline

  • --thread[=<style>], --no-thread - 控制添加 In-Reply-ToReferences 头以使第二个及后续邮件显示为第一个邮件的回复。还控制生成 Message-ID 头以供引用。 可选的 <style> 参数可以是 shallowdeep。'shallow' 线程使每封邮件成为系列头的回复,头从封面信、--in-reply-to 和第一个补丁邮件中按此顺序选择。'deep' 线程使每封邮件成为前一封的回复。 默认为 --no-thread,除非设置了 format.thread 配置。不带参数的 --thread 等同于 --thread=shallow

  • --in-reply-to=<message-id> - 使第一封邮件(或所有带 --no-thread 的邮件)显示为给定 <message-id> 的回复,这避免了为提供新的补丁系列而中断线程。

  • --ignore-if-in-upstream - 不包含与 <until>..<since> 中的提交匹配的补丁。

  • --always - 包含不引入任何更改的提交的补丁(默认情况下省略)。

  • --cover-from-description=<mode> - 控制封面信的哪些部分将使用分支的描述自动填充。 如果 <mode>messagedefault,封面信主题将填充占位符文本。封面信正文将填充分支的描述。 如果 <mode>subject,分支描述的第一段将填充封面信主题。 如果 <mode>auto,如果分支描述的第一段大于 100 字节,则模式为 message,否则使用 subject。 如果 <mode>none,封面信主题和正文都将填充占位符文本。

  • --subject-prefix=<subject-prefix> - 使用 '[<subject-prefix>]' 代替主题行中的标准 '[PATCH]' 前缀。这可用于命名补丁系列,并可与 --numbered 选项组合使用。

  • --filename-max-length=<n> - 在大约 '<n>' 字节处截断生成的输出文件名(太短的值将被静默提升到合理长度)。默认为 format.filenameMaxLength 配置变量的值,或 64(如果未配置)。

  • --rfc[=<rfc>] - 在主题前缀前加上字符串 <rfc>(默认为 "RFC")。由于主题前缀默认为 "PATCH",默认情况下您将得到 "RFC PATCH"。RFC 表示"征求意见";在发送用于讨论而不是应用的实验性补丁时使用。--rfc=WIP 也可能是一种有用的表示补丁尚未完成的方式("WIP" 代表"进行中的工作")。

  • -v <n>, --reroll-count=<n> - 将系列标记为主题的第 <n> 次迭代。输出文件名前加上 v<n>,主题前缀(默认为 "PATCH",但可通过 --subject-prefix 选项配置)后附加 v<n>

  • --to=<email> - 在电子邮件头中添加 To: 头。这除了任何已配置的头之外,可以多次使用。

  • --cc=<email> - 在电子邮件头中添加 Cc: 头。这除了任何已配置的头之外,可以多次使用。

  • --from, --from=<ident> - 在每封电子邮件的 From: 头中使用 ident。对于提交电子邮件,如果提交的作者身份在文本上与提供的 ident 不同,则在消息正文中放置带有原始作者的 From: 头。

  • --force-in-body-from, --no-force-in-body-from - 使用通过 --from 选项指定的电子邮件发件人时,默认情况下,如果发件人与作者不同,则在提交日志消息顶部添加正文中的 "From:" 以标识提交的真正作者。

  • --add-header=<header> - 在电子邮件头中添加任意头。

  • --cover-letter, --no-cover-letter - 除了补丁外,还生成包含分支描述、提交列表和整体 diffstat 的封面信文件。

  • --commit-list-format=<format-spec> - 指定生成补丁系列的提交列表的格式。format-spec 的接受值为 shortlogmodern 或以 log: 为前缀的格式字符串。

  • --encode-email-headers, --no-encode-email-headers - 使用 "Q-encoding"(RFC 2047 中描述)编码具有非 ASCII 字符的电子邮件头。

  • --interdiff=<previous> - 作为审查辅助,在封面信中插入一个 interdiff,或作为单个补丁系列的注释,显示补丁系列的先前版本与当前正在格式化的系列之间的差异。

  • --range-diff=<previous> - 作为审查辅助,在封面信中插入一个 range-diff(参见 git-range-diff(1)),或作为单个补丁系列的注释。

  • --creation-factor=<percent> - 与 --range-diff 一起使用,通过调整创建/删除成本模糊因子来调整匹配先前和当前补丁系列之间的提交的启发式方法。默认为 999。

  • --notes[=<ref>], --no-notes - 在三条破折号行后附加提交的注释(参见 git-notes(1))。默认为 --no-notes,除非设置了 format.notes 配置。

  • --signature=<signature>, --no-signature - 向生成的每条消息添加签名。根据 RFC 3676,签名通过包含 '-- ' 的行与正文分开。如果省略签名选项,签名默认为 Git 版本号。

  • --signature-file=<file> - 与 --signature 工作方式相同,只是签名从文件中读取。

  • --suffix=.<sfx> - 使用指定的后缀代替 .patch 作为生成文件名的后缀。常见的替代是 --suffix=.txt。留空将删除 .patch 后缀。

  • -q, --quiet - 不将生成的文件名打印到标准输出。

  • --no-binary - 不输出二进制文件中更改的内容,而是显示这些文件已更改的通知。使用此选项生成的补丁无法正确应用,但它们仍然对代码审查有用。

  • --zero-commit - 在每个补丁的 From 头中输出全零哈希而不是提交的哈希。

  • --no-base, --base[=<commit>] - 记录基础树信息以标识补丁系列应用到的状态。有关详细信息,请参阅下面的基础树信息部分。如果 <commit> 为 "auto",则自动选择基础提交。--no-base 选项覆盖 format.useAutoBase 配置。

  • --root - 将修订参数视为 <revision-range>,即使它只是单个提交(通常会被视为 <since>)。

  • --progress - 生成补丁时在 stderr 上显示进度报告。

配置

您可以指定要添加到每条消息的额外邮件头行、主题前缀和文件后缀的默认值、输出多个补丁时编号补丁、添加 "To:" 或 "Cc:" 头、配置附件、更改补丁输出目录以及使用配置变量签名补丁。

[format]
	headers = "Organization: git-foo\n"
	subjectPrefix = CHANGE
	suffix = .txt
	numbered = auto
	to = <email>
	cc = <email>
	attach [ = mime-boundary-string ]
	signOff = true
	outputDirectory = <directory>
	coverLetter = auto
	commitListFormat = shortlog
	coverFromDescription = auto

讨论

'git format-patch' 生成的补丁采用 UNIX 邮箱格式,带有固定的"魔术"时间戳以指示文件是 format-patch 的输出而不是真实的邮箱,如下所示:

From 8f72bad1baf19a53459661343e21d6491c3908d3 Mon Sep 17 00:00:00 2001
From: Tony Luck <tony.luck@intel.com>
Date: Tue, 13 Jul 2010 11:42:54 -0700
Subject: [PATCH] =?UTF-8?q?[IA64]=20Put=20ia64=20config=20files=20on=20the=20?=
 =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig=20diet?=

通常它将被放置在 MUA 的草稿文件夹中,编辑以在三条破折号后添加不应进入更改日志的及时评论,然后作为消息发送。在接收端,读者可以将有趣的补丁保存在 UNIX 邮箱中并使用 git-am(1) 应用它们。

检查补丁损坏

许多邮件客户端如果设置不当会损坏空格。以下是两种常见的损坏类型:

  • 没有任何空格的空上下文行。

  • 在开头多了一个空格的非空上下文行。

测试 MUA 设置是否正确的一种方法是:

  • 将补丁发送给自己,方式与您发送的方式完全相同,只是 To: 和 Cc: 行不包含列表和维护者地址。

  • 将该补丁以 UNIX 邮箱格式保存到文件中。例如命名为 a.patch。

  • 应用它:

    $ git fetch <project> master:test-apply
    $ git switch test-apply
    $ git restore --source=HEAD --staged --worktree :/
    $ git am a.patch

MUA 特定提示

以下是一些关于如何使用各种邮件客户端成功内联提交补丁的提示。

GMail

GMail 在 Web 界面中没有任何方法可以关闭自动换行,因此它会破坏您发送的任何电子邮件。但是,您可以使用 "git send-email" 通过 GMail SMTP 服务器发送补丁,或使用任何 IMAP 电子邮件客户端连接到 google IMAP 服务器并通过它转发邮件。

有关使用 'git send-email' 通过 GMail SMTP 服务器发送补丁的提示,请参阅 git-send-email(1) 的示例部分。

有关使用 IMAP 接口提交的提示,请参阅 git-imap-send(1) 的示例部分。

Thunderbird

默认情况下,Thunderbird 既会换行电子邮件也会将它们标记为 'format=flowed',这两者都会使结果电子邮件无法被 Git 使用。

有三种不同的方法:使用附加组件关闭换行、配置 Thunderbird 不破坏补丁,或使用外部编辑器防止 Thunderbird 破坏补丁。

基础树信息

基础树信息块用于维护者或第三方测试人员了解补丁系列应用到的确切状态。它由"基础提交"(项目历史稳定部分中众所周知的提交,其他所有人都在此基础上工作)和零个或多个"先决补丁"(已知在进行中但尚未成为"基础提交"一部分的补丁,需要在应用补丁之前按拓扑顺序应用在"基础提交"之上)组成。

示例

  • 提取修订 R1 和 R2 之间的提交,并使用 'git am' 将它们应用到当前分支之上:

    $ git format-patch -k --stdout R1..R2 | git am -3 -k
  • 提取当前分支中但不在 origin 分支中的所有提交:

    $ git format-patch origin

    为每个提交在当前目录中创建单独的文件。

  • 提取自项目开始以来通向 'origin' 的所有提交:

    $ git format-patch --root origin
  • 从当前分支提取三个最顶部的提交并格式化为可通过电子邮件发送的补丁:

    $ git format-patch -3

注意事项

请注意,format-patch 将从输出中省略合并提交,即使它们是请求范围的一部分。简单的 "patch" 不包含足够的信息供接收端重现相同的合并提交。

另请参阅

git-am(1), git-send-email(1)

Git

git(1) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布