git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: git-am applies commit message diffs

From
Jeff King <peff@peff.net>
Date
Feb 10, 2026, 06:56 UTC
Message-ID
<20260210065613.GC1756549@coredump.intra.peff.net>
In-Reply-To
<aYoEO0CcVt2Qjgnb@pks.im>
On Mon, Feb 09, 2026 at 04:58:51PM +0100, Patrick Steinhardt wrote:
Show 23 quoted lines
> > 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:
> 
>   - They ought to double-check the patch.
> 
>   - They can override the check with "--accept-ambiguous-patch".
> 
> It at least notifies the user that something potentially-fishy is going
> on, even though it still shifts the burden onto the person that applies
> the patch. But I guess that cannot ever be avoided anyway, at least in
> the general case.

Yes, I think you could detect ambiguous cases on the receiving side. You might need some heuristics to reduce false positives, though, since it is permitted to include extra content between and after diffs (e.g., format-patch writes signature lines by default).

So you'd probably need some rules like:
  - Multiple instances of "---" always generate a warning. Though I
    won't be surprised if it turns out that people often do:
       the commit message
       Signed-off-by: etc...
       ---
       Here is some cover letter material.
       ---
         [diffstat goes here]
    That's totally fine, but indistinguishable from the case that the
    commit message contains a "---" and is being truncated.
  - Presence of "diff" header before "---", which means there is
    probably a diff inside the commit message. But then what about when
    there is no "---" at all (as in a non-git patch)? Maybe the rule
    needs to be "there is a --- line after a diff header" or something.
  - Presence of non-empty text lines after a "diff" header (but not at
    the end, which would trigger pointlessly on signature lines). We
    would never generate this with format-patch, but it is historically
    allowed. I sometimes use it when talking through a "something like
    this..." patch. I don't expect those to become real commits, but I
    imagine people do apply them sometimes.

Of course you can sweep all of the false positives under the "well, you'll have to re-run with --accept-ambiguous-patch" rug. But we would want to make sure we do not require that often enough to be annoying.

-Peff
Previous: Junio C HamanoNext: Phillip Wood
Message 28 of 65 in “git-am applies commit message diffs”
  1. Matthias BeyerFeb 6, 2026
  2. Jacob KellerFeb 6, 2026
  3. Matthias BeyerFeb 6, 2026
  4. Jeff KingFeb 6, 2026
  5. 0/3 commit-msg.sample: reject messages that would confuse "git am"Phillip Wood, Feb 7, 2026
  6. 1/3 templates: add .gitattributes entry for sample hooksPhillip Wood, Feb 7, 2026
  7. 2/3 templates: detect commit messages containing diffsPhillip Wood, Feb 7, 2026
  8. 3/3 templates: detect messages that contain a separator linePhillip Wood, Feb 7, 2026
  9. Junio C HamanoFeb 7, 2026
  10. Kristoffer HaugsbakkFeb 7, 2026
  11. Junio C HamanoFeb 9, 2026
  12. Jeff KingFeb 9, 2026
  13. Phillip WoodFeb 9, 2026
  14. Jeff KingFeb 10, 2026
  15. Jeff KingFeb 9, 2026
  16. Phillip WoodFeb 9, 2026
  17. Matthias BeyerFeb 9, 2026
  18. Jeff KingFeb 10, 2026
  19. Patrick SteinhardtFeb 9, 2026
  20. Jacob KellerFeb 10, 2026
  21. Patrick SteinhardtFeb 10, 2026
  22. Junio C HamanoFeb 10, 2026
  23. Jacob KellerFeb 11, 2026
  24. Jacob KellerFeb 11, 2026
  25. Jeff KingFeb 11, 2026
  26. Kristoffer HaugsbakkFeb 11, 2026
  27. Junio C HamanoFeb 11, 2026
  28. Jeff KingFeb 10, 2026
  29. 0/2 commit-msg.sample: reject messages that would confuse "git am"Phillip Wood, Feb 13, 2026
  30. 1/2 templates: add .gitattributes entry for sample hooksPhillip Wood, Feb 13, 2026
  31. 2/2 templates: detect commit messages containing diffsPhillip Wood, Feb 13, 2026
  32. Kristoffer HaugsbakkFeb 13, 2026
  33. Junio C HamanoFeb 13, 2026
  34. Phillip WoodFeb 14, 2026
  35. Junio C HamanoFeb 13, 2026
  36. Phillip WoodFeb 14, 2026
  37. Junio C HamanoFeb 14, 2026
  38. Junio C HamanoFeb 13, 2026
  39. Florian WeimerFeb 6, 2026
  40. Jeff KingFeb 6, 2026
  41. Florian WeimerFeb 6, 2026
  42. Jeff KingFeb 6, 2026
  43. Kristoffer HaugsbakkFeb 6, 2026
  44. Jakob HaufeFeb 6, 2026
  45. Kristoffer HaugsbakkFeb 7, 2026
  46. Kristoffer HaugsbakkFeb 7, 2026
  47. doc: add caveat about roundtripping format-patchkristofferhaugsbakk@fastmail.com, Feb 8, 2026
  48. Junio C HamanoFeb 8, 2026
  49. Kristoffer HaugsbakkFeb 8, 2026
  50. Phillip WoodFeb 9, 2026
  51. Kristoffer HaugsbakkFeb 9, 2026
  52. Phillip WoodFeb 10, 2026
  53. Kristoffer HaugsbakkFeb 10, 2026
  54. doc: add caveat about roundtripping format-patchkristofferhaugsbakk@fastmail.com, Feb 9, 2026
  55. Junio C HamanoFeb 9, 2026
  56. Kristoffer HaugsbakkFeb 9, 2026
  57. Phillip WoodFeb 10, 2026
  58. Kristoffer HaugsbakkFeb 10, 2026
  59. doc: add caveat about round-tripping format-patchkristofferhaugsbakk@fastmail.com, Feb 12, 2026
  60. Junio C HamanoFeb 12, 2026
  61. Phillip WoodFeb 13, 2026
  62. Kristoffer HaugsbakkFeb 13, 2026
  63. Junio C HamanoFeb 13, 2026
  64. Christoph Anton MittererFeb 10, 2026
  65. Kristoffer HaugsbakkFeb 10, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.