移动历史SVN提交到现有的Github仓库?

时间:2013-05-13 09:14:18

标签: git svn github

前段时间我将Subversion存储库移动到Git和github,当我决定开源某些软件时,我不知道我做了什么,但是提交历史没有被移除。当时我以为我不在乎,但现在我觉得我真的很喜欢Github中2年多的提交,如果没有其他原因而不是工作记录。问题是我的项目已经在Github上工作了一段时间,并且自创建以来一直在分叉和接收提交。

有没有办法从我的旧回购中“退回”历史提交,并将它们放入生机勃勃的Github回购中?

注意:我半心半意地尝试了svn2git --rebase但是我不确定这是否会起作用,因为自从svn repo被遗忘以来已经有了提交。我收到了这个错误,我不确定它是什么意思:

 command failed:
 2>&1 git svn fetch

1 个答案:

答案 0 :(得分:2)

git中的Ancestry只不过是一个包含一行或多行parent <hash of parent commit>的提交(文本文件)。如果你想在第一次提交之前插入历史记录,那么就需要像这样的父行(第一次提交没有),这会改变第一次提交的哈希,这意味着它的后代需要更改父级指针,这通过所有提交递归,因为所有提交都来自repo的第一次提交。

如果您不担心搞乱叉子的人(因为您将更改项目中的历史记录),那么您可以重做操作以创建旧历史记录的第二个git仓库,将该仓库添加为你的新仓库的遥控器,并获取更改,现在你将在你的新仓库中有两个根。您可能会收到有关没有共同提交的警告;这可以。现在,您可以查看历史记录以获取方向:git log --all --graph --oneline --decorate,然后可能会执行rebase --onto以在您刚刚带来的旧回购历史记录之上移动新回购的新工作。可能是您新的树中的树repo的第一次提交将与旧repo的last中的树相同,所以这可能就像:git rebase --onto A B C一样简单,其中A是旧repo历史中的最后一次提交,你刚刚引入,B是新回购中的第一个提交(这里被认为是新回购的“旧基础”,你不会重新定位旧历史,因为它应该是相同的,并且{{ 1}},这是新回购中你想要重新加入其中的分支的头部,可能是C

您的回购可能比这更复杂,您可能需要做更多的工作来确定接缝重新连接的确切位置,但这是一般的想法。现在你可以master,“newrepo”是你添加它时命名为遥控器的任何东西。这应该清除第二个根和所有提取的提交。最后,你可以强制推送到github。这将改变每个提交哈希,所以没有任何分支可以工作,但你将拥有所有的历史记录,人们可以再次克隆,或git remote rm newrepo到新的reset --hard以收回起来。您可能希望在您的回购页面上通知所有人,并且可能找到分叉的人并提醒他们您的意图。