From: Patrick Steinhardt <ps@pks.im>
To: Jacob Keller <jacob.keller@gmail.com>
Cc: Jeff King <peff@peff.net>, Matthias Beyer <mail@beyermatthias.de>,
git@vger.kernel.org, pyokagan@gmail.com
Subject: Re: git-am applies commit message diffs
Date: Tue, 10 Feb 2026 15:22:55 +0100 [thread overview]
Message-ID: <aYs_P8QujA6mL81-@pks.im> (raw)
In-Reply-To: <CA+P7+xrNycJHTyJwn9AQcJLG0dDAE7KrTvWTHBi+CiQUqK8p5A@mail.gmail.com>
On Mon, Feb 09, 2026 at 06:16:35PM -0800, Jacob Keller wrote:
> On Mon, Feb 9, 2026 at 7:59 AM Patrick Steinhardt <ps@pks.im> wrote:
> >
> > On Fri, Feb 06, 2026 at 04:03:58AM -0500, Jeff King wrote:
> > > On Fri, Feb 06, 2026 at 09:18:50AM +0100, Matthias Beyer wrote:
> > >
> > > > That said, I am no expert in either C or the git codebase at all, but
> > > > from what I saw from reading the git-am codebase, it looks like it tries
> > > > to find the patch by looking for three dashes on a line with a linebreak
> > > > behind ("---\n").
> > >
> > > Yes, that is how the split is made.
> > >
> > > > From what I read, it looks for that from the first line.
> > > > What I would think of here is looking for that "patchbreak" from the
> > > > _end_ of the email rather than from the top, that would have prevented
> > > > this issue, right?
> > >
> > > The patch itself may legitimately contain "---" on a line by itself (it
> > > would indicate that the line "--" was removed from a file). That would
> > > confuse your parser, including in a way that we end up only applying
> > > part of the diff (everything before that fake "---" becomes commit
> > > message, and everything after becomes cover-letter material up to the
> > > next "diff" line).
> > >
> > > I suspect it also creates corner cases with cover-letter material
> > > (between the "---" and the diff itself) that itself contains any "---"
> > > marker.
> > >
> > > I don't think there is a way to unambiguously parse the single-stream
> > > output that format-patch produces. This is a reasonably well-known
> > > gotcha (at least around here). E.g., some earlier discussions:
> > >
> > > 2024: https://lore.kernel.org/git/ca13705ae4817ffba16f97530637411b59c9eb19.camel@scientia.org/
> > > 2022: https://lore.kernel.org/git/d0b577825124ac684ab304d3a1395f3d2d0708e8.1662333027.git.matheus.bernardino@usp.br/
> > > 2015: https://lore.kernel.org/git/CAFOYHZC6Qd9wkoWPcTJDxAs9u=FGpHQTkjE-guhwkya0DRVA6g@mail.gmail.com/
> > >
> > > There are probably more, but it's actually a tricky thing to search for
> > > in the archive, so I stopped digging. ;)
> >
> > Maybe we can't parse it unambiguously. But what we _can_ detect is that
> > a patch is ambiguous in the first place, right? So maybe we could extend
> > git-am(1) to bail by default with a hint that tells the user that:
> >
>
> I think it might make sense in a breaking change to update format
> patch and git am to have an "unambiguous" mode which would allow
> somehow to unambiguously distinguish between commit message contents
> and patch data. I'm not 100% sure how to do this, and it likely
> requires some sort of breaking changes to both tools to allow
> distinguishing properly between the two points.
That is worth a thought indeed. I guess one of the biggest questions
here is whether we can introduce such an unambiguous mode in such a way
that old Git clients/patch(1) would continue to understand them. I
wouldn't mind much if they would still misinterpret the ambiguous parts.
But if so, we could make this unambiguous mode the default without a
breaking change.
This is all pure speculation though, I have no idea whether such a
backwards-compatible and forwards-safe mode exists.
> Obviously if you're sending the contents together, a malicious user
> could edit the formatted patch to move or copy whatever the
> "signifier" for patch vs commit separator is... but at least we'd
> prevent the cases where someone accidentally includes diffs without
> intending to.
Well, if we had such an unambiguous mode I would say that eventually,
Git should start to refuse patches that have been generated without this
mode by default.
Patrick
next prev parent reply other threads:[~2026-02-10 14:23 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-06 7:43 git-am applies commit message diffs Matthias Beyer
2026-02-06 8:04 ` Jacob Keller
2026-02-06 8:18 ` Matthias Beyer
2026-02-06 9:03 ` Jeff King
2026-02-07 14:57 ` [PATCH 0/3] commit-msg.sample: reject messages that would confuse "git am" Phillip Wood
2026-02-07 14:58 ` [PATCH 1/3] templates: add .gitattributes entry for sample hooks Phillip Wood
2026-02-07 14:58 ` [PATCH 2/3] templates: detect commit messages containing diffs Phillip Wood
2026-02-07 14:58 ` [PATCH 3/3] templates: detect messages that contain a separator line Phillip Wood
2026-02-07 21:27 ` Junio C Hamano
2026-02-07 21:38 ` Kristoffer Haugsbakk
2026-02-09 0:17 ` Junio C Hamano
2026-02-09 7:00 ` Jeff King
2026-02-09 10:42 ` Phillip Wood
2026-02-10 6:44 ` Jeff King
2026-02-09 6:57 ` [PATCH 0/3] commit-msg.sample: reject messages that would confuse "git am" Jeff King
2026-02-09 10:43 ` Phillip Wood
2026-02-09 11:07 ` Matthias Beyer
2026-02-10 6:46 ` Jeff King
2026-02-09 15:58 ` git-am applies commit message diffs Patrick Steinhardt
2026-02-10 2:16 ` Jacob Keller
2026-02-10 14:22 ` Patrick Steinhardt [this message]
2026-02-10 15:47 ` Junio C Hamano
2026-02-11 2:31 ` Jacob Keller
2026-02-11 2:34 ` Jacob Keller
2026-02-11 7:47 ` Jeff King
2026-02-11 15:23 ` Kristoffer Haugsbakk
2026-02-11 15:47 ` Junio C Hamano
2026-02-10 6:56 ` Jeff King
2026-02-13 14:34 ` [PATCH v2 0/2] commit-msg.sample: reject messages that would confuse "git am" Phillip Wood
2026-02-13 14:34 ` [PATCH v2 1/2] templates: add .gitattributes entry for sample hooks Phillip Wood
2026-02-13 14:34 ` [PATCH v2 2/2] templates: detect commit messages containing diffs Phillip Wood
2026-02-13 16:42 ` Kristoffer Haugsbakk
2026-02-13 18:08 ` Junio C Hamano
2026-02-14 14:46 ` Phillip Wood
2026-02-13 17:59 ` Junio C Hamano
2026-02-14 14:36 ` Phillip Wood
2026-02-14 15:42 ` Junio C Hamano
2026-02-13 17:41 ` [PATCH v2 0/2] commit-msg.sample: reject messages that would confuse "git am" Junio C Hamano
2026-02-06 8:59 ` git-am applies commit message diffs Florian Weimer
2026-02-06 9:24 ` Jeff King
2026-02-06 9:48 ` Florian Weimer
2026-02-06 10:08 ` Jeff King
2026-02-06 8:43 ` Kristoffer Haugsbakk
2026-02-06 17:45 ` Jakob Haufe
2026-02-07 10:08 ` Kristoffer Haugsbakk
2026-02-07 21:44 ` Kristoffer Haugsbakk
2026-02-08 0:11 ` [PATCH] doc: add caveat about roundtripping format-patch kristofferhaugsbakk
2026-02-08 1:39 ` Junio C Hamano
2026-02-08 17:18 ` Kristoffer Haugsbakk
2026-02-09 16:42 ` Phillip Wood
2026-02-09 17:59 ` Kristoffer Haugsbakk
2026-02-10 10:57 ` Phillip Wood
2026-02-10 16:00 ` Kristoffer Haugsbakk
2026-02-09 22:37 ` [PATCH v2] " kristofferhaugsbakk
2026-02-09 22:59 ` Junio C Hamano
2026-02-09 23:11 ` Kristoffer Haugsbakk
2026-02-10 11:02 ` Phillip Wood
2026-02-10 18:20 ` Kristoffer Haugsbakk
2026-02-12 22:28 ` [PATCH v3] doc: add caveat about round-tripping format-patch kristofferhaugsbakk
2026-02-12 23:19 ` Junio C Hamano
2026-02-13 14:41 ` Phillip Wood
2026-02-13 14:43 ` Kristoffer Haugsbakk
2026-02-13 18:02 ` Junio C Hamano
2026-02-10 0:53 ` [PATCH] doc: add caveat about roundtripping format-patch Christoph Anton Mitterer
2026-02-10 16:00 ` Kristoffer Haugsbakk
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aYs_P8QujA6mL81-@pks.im \
--to=ps@pks.im \
--cc=git@vger.kernel.org \
--cc=jacob.keller@gmail.com \
--cc=mail@beyermatthias.de \
--cc=peff@peff.net \
--cc=pyokagan@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox