Merge branch 'kh/doc-am-format-sendmail'

Doc update.

* kh/doc-am-format-sendmail:
  doc: add caveat about round-tripping format-patch
This commit is contained in:
Junio C Hamano
2026-02-25 11:54:16 -08:00
5 changed files with 62 additions and 7 deletions

View File

@@ -0,0 +1,33 @@
The output from linkgit:git-format-patch[1] can lead to a different
commit message when applied with linkgit:git-am[1]. The patch that is
applied may also be different from the one that was generated, or patch
application may fail outright.
ifdef::git-am[]
See the <<discussion,DISCUSSION>> section above for the syntactic rules.
endif::git-am[]
ifndef::git-am[]
include::format-patch-end-of-commit-message.adoc[]
endif::git-am[]
Note that this is especially problematic for unindented diffs that occur
in the commit message; the diff in the commit message might get applied
along with the patch section, or the patch application machinery might
trip up because the patch target doesn't apply. This could for example
be caused by a diff in a Markdown code block.
The solution for this is to indent the diff or other text that could
cause problems.
This loss of fidelity might be simple to notice if you are applying
patches directly from a mailbox. However, changes originating from Git
could be applied in bulk, in which case this would be much harder to
notice. This could for example be a Linux distribution which uses patch
files to apply changes on top of the commits from the upstream
repositories. This goes to show that this behavior does not only impact
email workflows.
Given these limitations, one might be tempted to use a general-purpose
utility like patch(1) instead. However, patch(1) will not only look for
unindented diffs (like linkgit:git-am[1]) but will try to apply indented
diffs as well.

View File

@@ -0,0 +1,8 @@
Any line that is of the form:
* three-dashes and end-of-line, or
* a line that begins with "diff -", or
* a line that begins with "Index: "
is taken as the beginning of a patch, and the commit log message
is terminated before the first occurrence of such a line.

View File

@@ -233,6 +233,7 @@ applying.
create an empty commit with the contents of the e-mail message
as its log message.
[[discussion]]
DISCUSSION
----------
@@ -252,14 +253,11 @@ where the patch begins. Excess whitespace at the end of each
line is automatically stripped.
The patch is expected to be inline, directly following the
message. Any line that is of the form:
message.
include::format-patch-end-of-commit-message.adoc[]
* three-dashes and end-of-line, or
* a line that begins with "diff -", or
* a line that begins with "Index: "
is taken as the beginning of a patch, and the commit log message
is terminated before the first occurrence of such a line.
This means that the contents of the commit message can inadvertently
interrupt the processing (see the <<caveats,CAVEATS>> section below).
When initially invoking `git am`, you give it the names of the mailboxes
to process. Upon seeing the first patch that does not apply, it
@@ -283,6 +281,13 @@ commits, like running 'git am' on the wrong branch or an error in the
commits that is more easily fixed by changing the mailbox (e.g.
errors in the "From:" lines).
[[caveats]]
CAVEATS
-------
:git-am: 1
include::format-patch-caveats.adoc[]
HOOKS
-----
This command can run `applypatch-msg`, `pre-applypatch`,

View File

@@ -798,6 +798,10 @@ if they are part of the requested range. A simple "patch" does not
include enough information for the receiving end to reproduce the same
merge commit.
=== PATCH APPLICATION
include::format-patch-caveats.adoc[]
SEE ALSO
--------
linkgit:git-am[1], linkgit:git-send-email[1]

View File

@@ -692,6 +692,11 @@ Links of a few such community maintained helpers are:
- https://github.com/AdityaGarg8/git-credential-email[git-msgraph]
(cross platform client that can send emails using the Microsoft Graph API)
CAVEATS
-------
include::format-patch-caveats.adoc[]
SEE ALSO
--------
linkgit:git-format-patch[1], linkgit:git-imap-send[1], mbox(5)