Svn 将旧存储库转换为mercurial

Svn 将旧存储库转换为mercurial,svn,git,mercurial,Svn,Git,Mercurial,我一直在玩弄不同的版本控制系统,以找到一个我熟悉的版本控制系统。我从SVN开始(让我们把这个版本的项目称为“f1”),然后改为GIT。但我不知道如何将旧的SVN repo转换为GIT,所以我只是复制了文件夹,删除了.SVN内容,并将其转换为GIT repo(我们将此复制版本称为“f2”) 现在我正在和Mercurial打交道,很高兴地发现它有一个用于Windows的乌龟客户端。我也很高兴地发现将GIT回购转换成Mercurial是多么容易,所以我保留了历史记录(为了以防万一,我还是先克隆了它。所

我一直在玩弄不同的版本控制系统,以找到一个我熟悉的版本控制系统。我从SVN开始(让我们把这个版本的项目称为“f1”),然后改为GIT。但我不知道如何将旧的SVN repo转换为GIT,所以我只是复制了文件夹,删除了.SVN内容,并将其转换为GIT repo(我们将此复制版本称为“f2”)

现在我正在和Mercurial打交道,很高兴地发现它有一个用于Windows的乌龟客户端。我也很高兴地发现将GIT回购转换成Mercurial是多么容易,所以我保留了历史记录(为了以防万一,我还是先克隆了它。所以我把这个hg版本称为“f3”)

但现在我想知道的是:我如何处理旧的SVN回购协议,它仍然保存着我玩GIT之前的历史

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

在文字历史/祖先的意义上,如果不从根本上改变f3,就不能将f1前置到f3,因为mercurial中的每个修订都由哈希代码标识,而哈希代码是由修订内容及其父项的哈希(除其他外)构建的。因此,更改f3第一个节点的父节点将更改f3的所有哈希代码

因此,如果你愿意在生产过程中再生f3,比如说f4,你可以预先将f1添加到f3。这样做会使f3的所有克隆版本失效——但如果你是一个人的团队,你可能会同意

如果您不同意更改f3中的每个散列(我也不同意),另一个(不太好)选项是使用
hg convert
从f1创建新的mercurial回购,我们称之为f5,然后将
hg pull-f
f5转换为f3。因为f5中没有任何变更集是f3中任何变更集的祖先或子代——没有共同的血统——所以最终会有两个头部和两个变更集流。有些人这样做,但老实说,我看不出这样做有什么真正的好处

如果我告诉你,我会把f1转换成f5(一种有着你所有旧历史的变化无常的回购协议),然后把它保留下来作为参考。

你试过这个吗?它允许您拉取更改,即使存储库是不相关的

所以你能做的就是拿f1,把它转换成你的新回购协议,叫做HGSVN。本回购协议将为您保存整个svn创造的历史。如果您在f1中没有做更多的修改,那么您知道f3将保存副本(f2)之后的所有修改。现在您可以使用移植,将所有后续更改都移植到HGSVN中。是的,sha1总和可能已经更改,但由于HGSVN现在包含了您的整个开发历史,您可以忘记其他存储库


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

这一切看起来都比它的价值大得多。我有完整的历史记录,即使它在两个独立的存储库中。但是我每天都在学习更多关于Mercurial的知识:)谢谢。这是个好主意。但我还是要举手说,这工作太多了,不值得做;)