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

Re: Is there something like a git format-patch --squash?

From
Avery Pennarun <apenwarr@gmail.com>
Date
Feb 18, 2010, 21:56 UTC
Message-ID
<32541b131002181356n633418e1jb608dfa71e5f8a5b@mail.gmail.com>
In-Reply-To
<20100218203440.GA8110@coredump.intra.peff.net>
On Thu, Feb 18, 2010 at 3:34 PM, Jeff King <peff@peff.net> wrote:
Show 10 quoted lines
> On Thu, Feb 18, 2010 at 02:45:54PM -0500, Avery Pennarun wrote:
>> In the above, in the 'else' clause, what I really wanted was something like:
>>
>>    git format-patch --stdout --squash $parent..$commit
>>
>> with one big "| git am" at the end of the loop.
>
> I don't think there is a way to do it automagically. Obviously you can
> use diff (as you did) to produce the diff, but how should the many
> commit messages be combined?
Something like what merge --squash does would be fine, I think.

As it happens, the script I wrote ends up using the commit message from merge commits (since those are the ones that end up including all the patches from their side branch), which is precisely equivalent to how it would look in a "linearizing" SCM like svn or cvs.

I happen to have merge.summary=true in my ~/.gitconfig so my merge commits have extra information in them, though.

> Worst case, you could probably do it yourself by echoing the mail
> headers yourself, throwing all of the commit messages in the body, and
> then doing the diff:

True. But format-patch already has the code for that, so it's kind of error-prone to duplicate it.

> (also, do you really need $parent? In
> --first-parent --reverse, isn't it always going to be $commit^1?).

Good point. That script was quickly hacked together after a few iterations that previously did more important things with $parent.

Show 11 quoted lines
> But I think you can do it without diff application by just re-using the
> tree-state of each merge:
>
>  git rev-list --first-parent --reverse $from..$to |
>  last=$from
>  while read commit; do
>    last=`git cat-file commit $commit |
>          sed '1,/^$/d' |
>          git commit-tree $commit^{tree} -p $from`
>  done
>  git update-ref refs/heads/new $last

I don't think that works, since commit-tree takes the commit message on stdin but the other stuff via environment variables. Which is too bad, really, at least for this case.

Have fun,
Avery
Previous: Jeff King
Message 4 of 4 in “Is there something like a git format-patch --squash?”
  1. Avery PennarunFeb 18, 2010
  2. Avery PennarunFeb 18, 2010
  3. Jeff KingFeb 18, 2010
  4. Avery PennarunFeb 18, 2010

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.