【问题标题】:How do I fix broken Git history after migrating from Subversion?从 Subversion 迁移后如何修复损坏的 Git 历史记录?
【发布时间】:2023-03-23 12:13:02
【问题描述】:

根据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”分支。在修订版 B4A3 中,整个存储库已从 /svnroot/project/orig 移动到 /svnroot/project (我认为这与问题无关,但我提到它以防万一)。在 A4 中,使用 mvrm 命令而不是 svn merge 将“beta”分支合并回主干。

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

【问题讨论】:

  • 您知道 B1 的确切底座吗? Base 表示已提交 cp 的提交。
  • 我做了 A1 和 B1 树之间的差异。它们是相同的。

标签: git git-svn


【解决方案1】:

您可以使用嫁接来创建虚假的祖先信息。创建文件.git/info/grafts 并在其中放入类似的内容:

B1 A1
A4 A3 B5

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

当然,这样做会改写历史,如果其他人已经克隆了你的 git 存储库,那就不好了。

【讨论】:

  • 因为B1和A1的内容相同,所以不能嫁接。我实际上需要将 B2 移植到 A1 上。同样,我不得不选择更高版本来移植到 B5。一旦我得到了正确的版本,它就完美地工作了。
【解决方案2】:

git checkout beta - 拿下分支。

git rebase A1 - 将 beta 的提交移到 A1 之上。

git checkout A4 - 切换到 A4

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

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

git checkout trunk - 回到主干

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

【讨论】:

  • 我认为这不是 OP 想要的。合并已经完成,再次尝试合并很可能只会产生很多冲突。
  • 它们可以使用 A4 作为参考来解决...但是是的,只能手动,也许只是用 A4 重写所有文件(或通过软重置)。看起来您的解决方案更好,但我不确定我是否了解它是如何工作的。
  • 好的,幸运的是,有一种方法可以做得更好,使用ours 策略:stackoverflow.com/questions/727994/… - 这是一种无需更改即可记录合并的方法。
猜你喜欢
  • 2013-10-23
  • 2018-06-15
  • 2013-06-21
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2020-12-01
  • 1970-01-01
相关资源
最近更新 更多