将旧存储库转换为mercurial

时间:2010-03-25 23:13:20

标签: svn git mercurial

我一直在玩不同的版本系统,找到一个我很舒服的版本。我开始使用SVN(让我们称这个版本的项目为“f1”),然后转到GIT。但是我不知道如何将旧的SVN repo转换为GIT,所以我只是复制了文件夹,删除了.svn的东西,并把它变成了GIT repo(让我们称之为复制版“f2”)。

现在我正在玩Mercurial并且非常高兴地发现它有一个适用于Windows的Tortoise客户端。我也很高兴找到将GIT repo转换为Mercurial是多么容易,所以我保留了历史记录(我仍然首先克隆它,以防万一。所以我称这个hg版本为“f3”)。

但是现在我想知道的是:在使用GIT玩之前,我如何处理仍然保留历史的旧SVN回购?

我想我可以将旧的SVN repo转换为Mercurial,但是我可以将这两个历史记录合并到一个存储库中,这样我就可以在一个地方拥有一套完整的历史记录吗?换句话说,我可以将f1添加到f3吗?

2 个答案:

答案 0 :(得分:2)

你不能在文字历史/祖先意义上前缀 f1添加到f3而不会从根本上改变f3,因为mercurial中的每个修订版都由一个哈希码识别,并且该哈希码是由(以及其他事情)修订的内容和其父母的哈希。因此,更改f3的第一个节点的父节点将改变所有f3的哈希码。

所以你可以将f1添加到f3,如果你愿意在过程中重新生成f3,比如f4。这样做会使f3的所有克隆无效 - 但如果你是一个可能对你没事的团队。

如果你不能改变f3中的每个哈希(我不会)另一个(不太好)选项是使用hg convert从f1创建一个新的mercurial repo,让我们称之为f5,然后到hg pull -f f5到f3。由于f5中的任何变更集都不是f3中任何变更集的祖先或子节点 - 没有共同的血统 - 你最终会得到两个头和两个变换集流。有些人这样做,但说实话,我认为这样做没有任何实际好处。

我在哪里,我只是将f1转换为f5(一个包含所有旧历史的mercurial repo),然后保留它以供参考。

答案 1 :(得分:1)

你试过Transplant extension吗?它允许您提取更改,即使存储库不相关也是如此。

所以你可以做的是拿f1,把它转换成你的新回购,叫做HGSVN。这个回购将为您提供整个svn创建的历史记录。如果你在f1中没有进行任何修改,你知道f3在复制后保留所有修改(f2)。现在您可以使用移植,将所有后来的更改转换为HGSVN。是的,sha1-sums已被更改,但由于HGSVN现在包含您的整个开发历史记录,您可以忘记其他存储库。

顺便说一句。我建议你在进行实际移植之前做一个备份克隆。这样你就可以再次执行它,如果你得到错误的命令。希望这有帮助。