10

这是我的问题:

  1. 我使用了一段时间的 Subversion,直到我切换到 Git。又过了一段时间。
  2. 没有将历史从 Subversion 导入到 Git。这是一个严格的结帐,删除 .svn 目录,然后是 git init。不是明智之举。
  3. 现在,在数千次 git 提交之后,我找到了第一次 git 提交时创建的 Subversion 存储库的备份。啊哈!

我想将 git repo 回滚到第 0 天,正确导入 svn repo,然后重新应用所有 git 更改,从而更正第一次未完成的操作。

有没有人尝试过这个?我该怎么做呢?这听起来像是所有变基之母。

4

2 回答 2

15

听起来像是 git 移植的工作。这方面的文档有点粗略,但基本上你想要做的是:

  1. 在您的 repo 中获取 svn 的 git-svn 副本。最简单的方法是 git svn clone in,然后在现有存储库中获取 svn clone
  2. 找出哪个基本提交应该遵循 svn 提交。所以你可能在某个地方有一个 git root(“最后一个 SVN 版本”),它应该遵循最后一个实际的 SVN 版本。这是你刚刚获取的 git-svn clone 的头部
  3. 创建一个文件 .git/info/grafts 并将两个 sha 放在一行中。第一个是第一个 git 提交,然后是一个空格,然后是最后一个 svn 提交。这告诉 git git commit 不是没有父级的,但实际上有最后一个 svn 提交作为父级。
  4. 您现在可以使用 gitk/gitx/whatever 检查两个存储库是否已连接
  5. 要使更改永久化,请运行 git filter-branch。您可能需要先阅读它的联机帮助页。

当然,您也可以为所有分支执行第 3 步。jpalecek 方法的问题是变基会使你的历史变平,所以如果你有任何合并,变基会丢失它们。filter-branch 方法使您的历史记录完好无损。

于 2009-01-19T23:39:40.033 回答
1

我从来没有尝试过你想要的,但我正在用 CVS 做类似的事情。

基本上,我建议:

  1. 使用来自 svn 的历史创建一个新的 git 存储库
  2. 在这个新存储库中,git fetch来自 git 存储库的所有内容(不会有共同的提交)
  3. 然后,git branch remote/branch branch-lastgit rebase --onto svn-last remote/branch-first branch-lastremote/branch-first您导入的 git 存储库的第一次提交在哪里,等等。

如果你有更多的分支,事情就会更复杂。我认为重复第 3 步可能会,但你最好自己尝试一下。如果你的 git 历史中有合并,你可能需要git rebase -i -p .... 请记住,git 的优点是您基本上不会搞砸任何事情(尤其是如果您在单独的存储库中工作)。

于 2009-01-19T23:18:47.423 回答