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

Re: Alter parent ID of existing commit object

From
Paul Richards <paul.richards@gmail.com>
Date
Apr 26, 2010, 11:02 UTC
Message-ID
<k2za1138db31004260402le42e15fhc791700cbf28b17e@mail.gmail.com>
In-Reply-To
<20100426103637.GA8896@progeny.tock>
On 26 April 2010 11:38, Jonathan Nieder <jrnieder@gmail.com> wrote:
Show 44 quoted lines
> Hi Paul,
>
> Paul Richards wrote:
>
>> Is it possible to edit an old commit object and only alter the ID of
>> the parent commit but otherwise leave all the other information intact
>> (tree, message, authors, date, etc).
>>
>> I'd expect such a command to return the new hash of the modified commit.
>
> The standard answer to this question is to say “use grafts and
> filter-branch”.  The git-filter-branch(1) man page explains this
> approach.  It is very powerful, but sometimes I do not want to have
> that much power.
>
> So I will tell a secret: in the scenarios when I wanted something like
> this (actually, what I have occasionally wanted is to transform a
> single-parent commit into a merge), I did something like the following:
>
>  $ git cat-file commit $rev
>  tree dcd2cc4b76f8756423f5c1ab7d2c62d458a8b15f
>  parent 5f1e6d9ce35e212708f9adc55e6b9a7e0d296df4
>  author Will Palmer <wmpalmer@gmail.com> 1272275407 -0500
>  committer Jonathan Nieder <jrnieder@gmail.com> 1272275443 -0500
>
>  pretty: Respect --abbrev option
>
>  Prior to this, the output of git log -1 --format=%h was always 7
>  characters long, without regard to whether --abbrev had been passed.
>
>  Signed-off-by: Will Palmer <wmpalmer@gmail.com>
>  Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
>  $ git cat-file commit $rev >tmp
>  $ sed -i -e "s/parent .*/parent $(git rev-parse othercommit)/" tmp
>  $ git hash-object -t commit -w tmp
>  ca55c560685284ac6d121939b2cd881f426e7074
>
> Easy.  Still, I would be happy to see this packaged in a command, so I
> could recommend it in combination with ‘git replace’ to people who are
> scared of sed.
>
> Thanks for bringing it up.
> Jonathan
>

Thanks, this looks perfect. I knew about "cat-file", but "hash-object" was the missing command for me here. :)

-- 
Paul Richards
Previous: Jonathan NiederNext: Jakub Narebski
Message 3 of 4 in “Alter parent ID of existing commit object”
  1. Paul RichardsApr 26, 2010
  2. Jonathan NiederApr 26, 2010
  3. Paul RichardsApr 26, 2010
  4. Jakub NarebskiApr 26, 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.