# Removing part of the history

3 messages from 2008-11-28 to 2008-11-28. Participants: Samuel Lucas Vaz de Mello, Miklos Vajna, Jakub Narebski.
Thread: https://gitlist.dev/t/16517

## Samuel Lucas Vaz de Mello, 2008-11-28 21:23

Subject: Removing part of the history
Message-ID: <49306150.6010701@datacom.ind.br>
URL: https://gitlist.dev/e/49306150.6010701%40datacom.ind.br

```
Hi All,

I have a repository with code imported from CVS.

I first imported from CVS using git 1.5.6 and we started to develop in git branches.
I run cvsimport periodically and merged the changes from CVS (legacy developers) to our git branches.
After some time, I realized that the import was broken, upgraded to git 1.6 and reimported the data.
Now the imported data seems to be correct and I finished with a history tree like this:

(our branch1)             X--Y--Z
merges>                  /    \
(our branch2)       J--K--L--M--N--O--P
merges>             /     /     /
(cvs old) ...A--B--C--D--E     /
merges>                       /
(cvs new) ...A'-B'-C'-D'-E'-F'


There is any way to get rid of the (broken) cvs-old tree?

I've tried to rebase, but the commits from A' and A are different, it tries to reapply all history in CVS.

I've tried to checkout a point before our changes start (B') and then, using a script, cherry-pick all commits up to HEAD that are not in cvs-old branch. This approach didn't handled well merges between our branches (K-L-M and X-Y).

The history from the beginning up to the point where our changes started (...A--B) is quite large, so it would be nice for us to get rid of it. 

Any suggestion on how to handle this?

Thank you,

 - Samuel

```

## Miklos Vajna, 2008-11-28 21:34

Subject: Re: Removing part of the history
Message-ID: <20081128213454.GE19355@genesis.frugalware.org>
URL: https://gitlist.dev/e/20081128213454.GE19355%40genesis.frugalware.org
In-Reply-To: <49306150.6010701@datacom.ind.br>

```
On Fri, Nov 28, 2008 at 07:23:28PM -0200, Samuel Lucas Vaz de Mello <samuellucas@datacom.ind.br> wrote:
> There is any way to get rid of the (broken) cvs-old tree?
> 
> I've tried to rebase, but the commits from A' and A are different, it
> tries to reapply all history in CVS.

Have you tried git rebase --onto?

> I've tried to checkout a point before our changes start (B') and then,
> using a script, cherry-pick all commits up to HEAD that are not in
> cvs-old branch. This approach didn't handled well merges between our
> branches (K-L-M and X-Y).

git rebase --preserve-merges is probably what you are searching for.

```

## Jakub Narebski, 2008-11-28 22:38

Subject: Re: Removing part of the history
Message-ID: <m3fxlbjx41.fsf@localhost.localdomain>
URL: https://gitlist.dev/e/m3fxlbjx41.fsf%40localhost.localdomain
In-Reply-To: <49306150.6010701@datacom.ind.br>

```
Samuel Lucas Vaz de Mello <samuellucas@datacom.ind.br> writes:

> I have a repository with code imported from CVS.
> 
> I first imported from CVS using git 1.5.6 and we started to develop
> in git branches.  I run cvsimport periodically and merged the
> changes from CVS (legacy developers) to our git branches.  After
> some time, I realized that the import was broken, upgraded to git
> 1.6 and reimported the data.  Now the imported data seems to be
> correct and I finished with a history tree like this:
> 
> (our branch1)             X--Y--Z
> merges>                  /    \
> (our branch2)       J--K--L--M--N--O--P
> merges>             /     /     /
> (cvs old) ...A--B--C--D--E     /
> merges>                       /
> (cvs new) ...A'-B'-C'-D'-E'-F'
> 
> 
> There is any way to get rid of the (broken) cvs-old tree?
> 
> I've tried to rebase, but the commits from A' and A are different,
> it tries to reapply all history in CVS.
> 
> I've tried to checkout a point before our changes start (B') and
> then, using a script, cherry-pick all commits up to HEAD that are
> not in cvs-old branch. This approach didn't handled well merges
> between our branches (K-L-M and X-Y).
> 
> The history from the beginning up to the point where our changes
> started (...A--B) is quite large, so it would be nice for us to get
> rid of it.
> 
> Any suggestion on how to handle this?

You can use grafts (see "Repository Layout" documentation) to prune
'cvs old' branches, by adding for each merge commit <c_i> with one
side leading to 'cvs old' branch line to .git/info/grafts
  <c_i> <c_i^1>
where <c_i> is full hexadecimal object name.

Then check in gitk or some other history viewer if the history now
looks like you wanted (looks sane).

Then use "git filter-branch --all" to turn grafts into reality, check
out correctness, then remove refs/original/* and do git-gc.

HTH
-- 
Jakub Narebski
Poland
ShadeHawk on #git

```
