2013-05-13 105 views
0

前段时间我把一个Subversion版本库移到了Git和github上,当我决定开源一些软件时,我不确定我做了什么,但是提交历史没有移过来。当时我以为我不在乎,但现在我想我实际上非常喜欢Github上2年以上的提交,如果没有其他原因而不是工作记录。问题在于我的项目在Github上已经有一段时间了,并且自创建以来已经分叉并收到了提交。移动历史SVN提交到现有的Github回购?

有没有办法将我旧回购的历史承诺“退回”,并将它们放入活的呼吸Github回购?

注意:我半心半意地尝试svn2git --rebase,但我不确定这是否会工作,考虑到自svn回购被遗弃以来已经有提交。我得到这个错误,我不知道这意味着什么:

command failed: 
2>&1 git svn fetch 

回答

2

祖先在git的无非是一个承诺(这是一个文本文件)包含读取parent <hash of parent commit>一行或多行。如果你想在你的第一次提交之前插入历史记录,它需要一个像这样的父行(第一次提交没有),并且这将改变第一次提交的散列,这意味着它的后代将需要改变父代指针,并且这通过所有提交递归地提升,因为所有提交都来自回购的第一次提交。

如果你不担心弄乱从事叉子工作的人(因为你会改变项目的历史),那么你可以重做操作来创建旧历史的第二个git仓库,添加回购作为您的新回购的远程并获取更改,现在您将在新回购中拥有两个根。您可能会收到关于没有任何共同提交的警告;这可以。现在,您可以查看历史记录以获取您的方向:git log --all --graph --oneline --decorate,然后可能执行rebase --onto将新回购的新工作移至您刚刚带来的旧回购历史记录的顶部。假设新回购的第一次提交中的树将与树在你的旧回购的最后,所以这可能是如此简单:git rebase --onto A B C,其中A是旧回购的历史中的最后一个提交,您刚刚提交,B是新回购(这是正在考虑的新的回购的“旧基础”,你不是重新回到旧的历史,因为它应该是相同的,并且C,这是新回购的分支机构的头,你想重新分配到这个,可能master

您的回购可能会更复杂t韩,你可能需要做更多的工作来确定接缝的位置,以便重新加入事情,但这是总体思路。现在你可以使用git remote rm newrepo,“newrepo”就是你在添加遥控器时命名的任何东西。这应该清除第二个根目录和所有提交的提交。最后,你可以强制推送给github。这实际上已经改变了每个提交散列,因此没有一个分支会工作,但是你将拥有所有的历史记录,并且人们可以再次克隆,或者reset --hard到达新的master以追上。您可能希望在您的回购页面上告知所有人这些信息,并且可能会找到分享并提醒他们意图的人。

相关问题