2013-03-02 126 views
2

当我第一次进入VC时,我使用SVN并且不理解我在做什么。我在单独的中继上维护了一个项目的不同部分,但会一次提交所有中继,导致多次提交相同的提交消息。大约两年前,我醒来时把所有的树干都sm成了一根树干,然后再次醒来,并将回购变为git。现在我有一个快速,灵活的回购与少数分支机构,我不能更高兴...重写历史记录以删除重复的提交消息

...除了所有这些旧的,重复提交消息正在窃听我。 (在我的回购中,它们构成了约1/3-1/2的提交)。这正是git rebase的目的,对吧?我尝试了一批重复测试,除了它看起来像是将我的master分支与其他所有分支分开之外,它的工作原理。我用git rebase -i <sha>做到了这一点,并将所有重复提交压缩到第一个。我想保持我的分支结构完好无损。

所有我想压扁的重复邮件都出现在我进行svn=>git转换之前,并且所有分支都在转换后启动。也就是说在svn=>git转换之前的整个历史记录是线性的,没有分支。

另一个警告 - 这是一个很大的 - 是这个回购已被推到远程回购。我知道为共享回购重写历史记录是个坏消息,但我只是在考虑它,因为还没有人从我的远程设备克隆或分支。我希望在将其提供给克隆/分叉之前清理历史记录。

那么有没有一种方法可以将历史记录重写为某一点,并保持其余的不变?任何其他的建议,以帮助我清理这个烂摊子?

回答

3

您可以使用rebase将两个旧提交压缩为一个,但这会导致全新的提交。因此,rebase必须更改所有childs(提交后直接提交)以指向新提交,这将再次导致全新的提交。 - 等等......

修改/重新绑定旧提交会因此导致一个全新的提交图。其他分支仍然指向旧图。这就是为什么你将你的分支与其他所有分支分开的原因。

根据提交分支的复杂性,清理起来非常棘手。 很可能你应该直接离开你的存储库。

如果你真的想改变历史。你应该创建一个新的分支,指向你最后一次SVN提交,它应该是你所有分支的父代。 git tag oldsvn $SHA1; git checkout -b newsvn oldsvn

您现在可以清理该分支,然后重新绑定该分支上的所有其他分支。 (这是rebase的真正想法,给一个分支新的基地。) 您可以使用git rebase --onto newsvn oldsvn $branch

由于您可能正在重写具有共同历史记录的多个分支,您可能会再次为您的分支获得不同的树。看看Git: How to rebase many branches (with the same base commit) at once?

+0

Ewww。看起来,单独留下足够的空间是去这里的方式。谢谢。 – Clayton 2013-03-14 20:44:21