From: Jakub Narebski Date: Fri, 28 Nov 2008 22:38:22 GMT Subject: Re: Removing part of the history Message-ID: In-Reply-To: <49306150.6010701@datacom.ind.br> Samuel Lucas Vaz de Mello 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 with one side leading to 'cvs old' branch line to .git/info/grafts where 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