【问题标题】:Git - Accidentally Overwrote Entire Commit History of Remote RepositoryGit - 意外覆盖了远程存储库的整个提交历史
【发布时间】:2011-05-24 04:55:47
【问题描述】:

为了在 Git 和 SVN 之间建立一座桥梁,让一个项目的开发人员可以使用 SVN,而另一个项目的开发人员可以使用 Git,我无意中覆盖了远程存储库中的整个 git 提交历史记录。这是导致错误的基本工作流程。

  1. 克隆了远程 Git 存储库
  2. 按照一系列命令将 Git 存储库导入 SVN。

    一个。我尝试了通过 stackoverflow 和其他几个位置找到的各种方法,使用本地 SVN 存储库作为测试。鉴于我运行它们的 Git 存储库,它们中的大多数都失败了。但是,在http://eikke.com/importing-a-git-tree-into-a-subversion-repository/ 找到的这组步骤似乎是成功的,所以我最终使用了这些步骤。

    b.这只是半成功。导入 SVN 尝试获取所有 git 提交历史并将其作为 SVN 提交日志导入,但在大约 2/3 时失败。最后三分之一作为单个提交提交到 SVN。此外,所有提交日期都被当前日期覆盖,并且大部分作者都被覆盖了。鉴于这是在 SVN 存储库中,而不是实际的 Git 存储库中,我并不太担心。

  3. 有人从 SVN 检查代码,进行更改并提交。
  4. 使用 git svn 获取更改
  5. 已将更改推送到远程存储库。

最终结果是整个提交历史都被现在 SVN 中的内容覆盖了。因此,提交日期和作者发生了变化,最后 1/3 的提交历史丢失了。有可能恢复吗?

如果没有,我找到了本地存储库的备份,该备份是我在过程中间的某个地方创建的。它似乎具有所有原始提交历史记录。是否有可能用我在这个本地备份中的内容以某种方式覆盖远程存储库上的提交数据?

【问题讨论】:

    标签: svn git git-svn


    【解决方案1】:

    如果您将更改推送到遥控器,您并没有真正覆盖任何内容;毕竟是版本控制。您应该能够通过将 HEAD 重置为执行任何操作之前的位置来恢复遥控器的状态。假设我没有误解你做了什么,你真正需要做的就是像

    git checkout <SHA-of-old-head>
    git add -A
    git commit
    git push
    

    ...你会回到你开始的地方,尽管你的错误将保留在遥控器的历史中。如果您不想这样,您需要直接在遥控器上工作并将 HEAD 移回原来的位置。

    【讨论】:

    • 事实证明,svn 将所有 Git 提交作为单独的 SVN 提交导入。 git svn fetch 检索所有这些提交,git push 将它们作为新提交推送到远程 Git 存储库。这导致过多的提交看起来像日志中的原始提交,但实际上是原始提交的副本。这就是为什么我认为历史已被覆盖。感谢您的帖子,它使我朝着正确的方向前进。
    猜你喜欢
    • 2012-12-06
    • 2011-09-12
    • 1970-01-01
    • 2011-10-06
    • 2020-12-06
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多