我已根据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个修订版。
答案 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之后重新提交到新的合并点。