All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Jakub Narębski" <jnareb@gmail.com>
To: Johannes Sixt <j6t@kdbg.org>, Henning Moll <newsScott@gmx.de>,
	git@vger.kernel.org
Subject: Re: squash commits deep down in history
Date: Fri, 24 Oct 2014 13:43:22 +0200	[thread overview]
Message-ID: <544A3B5A.6030801@gmail.com> (raw)
In-Reply-To: <54496036.8080109@kdbg.org>

W dniu 2014-10-23 22:08, Johannes Sixt pisze:
> Am 23.10.2014 um 14:34 schrieb Henning Moll:

>> i need to squash several commits into a single one in a automated
>> way. I know that there is interactive rebase, which can also be
>> automated using GIT_SEQUENCE_EDITOR. Unfortunately my history is very
>> large and i need to squash deep down in the history several times. So
>> using interactive rebase seems not to be the right tool.
>>
>> I wonder if i can solve this task using filter-branch? I have a file
>> that list the SHA1s for each squash operation per line. All SHA1s of
>> a line are in chronological order (youngest to oldest), or in other
>> words: the first SHA1 is the child of the second, and so on.
>
> Use git-replace do construct a squashed commit that replaces the last
> child in each run such that its parent points to the parent of the first
> in the run. Then use a git-filter-branch without filters to burn the
> parenthood into the history.

Using grafts (which are only about parentage, and are purely local) with 
filter-less git-filter-branch might be easier than git-replace.

If you have the following history:

     ... <--- O <--- A <--- B <--- C <--- ...

and you want to squash A, B, C into

     ... <--- O <----------------- C <--- ...

simply add the following to .git/info/grafts

    <sha-1 of C> <sha-1 of O>

for example with

    echo "$(git rev-parse C) $(git rev-parse C^^^)" >>.git/info/grafts

Check if the history is correct e.g. with "git log --graph --oneline",
then use filter-branch.

BTW. do you know if it is possible to run filter-branch without 
replacing replaces?


Just for completeness, yet another way to do scripted history rewriting 
is to use git-fast-export + some editing script (e.g. reposurgeon[1]) + 
git-fast-import.

[1]: http://www.catb.org/esr/reposurgeon/

-- 
Jakub Narębski

  parent reply	other threads:[~2014-10-24 11:43 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-23 12:34 squash commits deep down in history Henning Moll
2014-10-23 20:08 ` Johannes Sixt
2014-10-23 22:20   ` Henning Moll
2014-10-24 11:43   ` Jakub Narębski [this message]
2014-11-04 17:25 ` Phil Hord

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=544A3B5A.6030801@gmail.com \
    --to=jnareb@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=j6t@kdbg.org \
    --cc=newsScott@gmx.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.