从Subversion迁移后如何修复损坏的Git历史记录?

时间:2011-11-16 19:42:11

标签: git git-svn

我已根据How to migrate SVN with history to a new Git repository将项目的Subversion存储库迁移到Git。它工作得很好,除了由于在我们的历史中不正确地使用Subversion而存在一个断开连接的分支。我不确定用什么术语来描述这个分支的状态。这是它的样子:

trunk: ...-A1--->        <---A3----A4-...

beta:         B1--B2--B3--B4----B5

据我所知,这就是发生的事情。在修订版 B1 时,使用 cp 而不是 svn cp 创建了一个新的“beta”分支。在修订版 B4 A3 时,整个存储库从 / svnroot / project / orig 移动到 / svnroot / project (我不认为这与问题有关,但我提到它以防万一)。在 A4 ,使用 mv rm 命令而不是 svn merge 将“beta”分支合并回主干。

如何修复Git存储库历史记录,以便 B1 A1 正确分支, B5 合并回 A4 ?请注意,“beta”分支实际上有75个修订版。

2 个答案:

答案 0 :(得分:2)

您可以使用移植物创建假的祖先信息。创建文件.git/info/grafts并将类似内容放入其中:

B1 A1
A4 A3 B5

但是不要使用模式中的提交名称,而是使用完整的SHA1。在此之后,请确保历史记录看起来像您想要的那样。如果是,您可以通过git filter-branch --all使移植物永久化。

当然,这样做会重写历史记录,如果其他人已经克隆了你的git repo,那就不好了。

答案 1 :(得分:0)

git checkout beta - 参加分会。

git rebase A1 - 在A1之上移动beta的提交。

git checkout A4 - 切换到A4

git checkout -b new_merge_point - 为合并创建临时分支

git merge beta - 合并。可能是冲突?!。

git checkout trunk - 回到主干

git rebase new_merge_point在A4之后重新提交到新的合并点。