来自Subversion的Mercurial:移动,重命名和标记

时间:2009-08-25 17:43:43

标签: svn mercurial merge

我有一个具有以下布局的subversion repo:

svnrepo/projectA/trunk
svnrepo/projectA/tags
svnrepo/projectA/branches
svnrepo/projectB/trunk
svnrepo/projectB/tags
svnrepo/projectB/branches


我希望转到一个经过修改的布局的mercurial回购:
hgrepo /了projectA
hgrepo /项目B

这样做的最佳方式是什么?我的一些想法是:

选项1

将subversion中的路径(使用svn move)重新排列为中间格式:

svnrepo/trunk/projectA
svnrepo/trunk/projectB
svnrepo/tags/projectA
svnrepo/tags/projectB
svnrepo/branches/projectA
svnrepo/branches/projectB

然后hg转换为svnrepo / trunk。这会混淆hg导入吗?

选项2 hg将每个项目/主干转换为单独的hg repos。然后将它们合并到一个单独的hg repo中(使用hg init,hg pull -f projectA等)。我认为这将丢失第一个导入项目的分支名称和标签。

2 个答案:

答案 0 :(得分:6)

在Mercurial中,将不相关的代码库存储在同一个存储库中是一个坏主意,因为它将

  • 合并显着复杂化。合并将取决于对所有项目所做的更改,而不仅仅是您尝试合并的项目。
  • 导致存储和检出开销 - 据我所知,Mercurial不支持仅检出存储库的子目录。您必须立即分支所有项目。

解决方案是将您的单个Subversion存储库转换为多个Mercurial存储库。大多数转换工具都支持此功能。

答案 1 :(得分:4)

每个项目都应该在自己的Hg存储库中(只能获取或标记特定项目)。

请记住,在Subversion(主干,标签,分支)中看到的目录将不存在于任何现代(D)VCS中,其中分支和标签是一等公民(即由工具直接管理的元数据),如由于廉价副本(在SVN中)而导致的简单目录。

这意味着当您转换SVN存储库时,不应直接在Hg存储库的历史记录中存储任何“trunk”,“tags”或“branches”目录。

您应该使用tool like hgsubversion将SVN仓库(例如“repo / projectA”)导入专用于projectA的Hg仓库。它将保留原始SVN项目的标签和分支,并将它们转换为Hg对象 来自its documentation

  

使用hgpullsvn的所有更新都是在从SVN URL的最后一个组件命名的分支中进行的(例如,如果SVN URL为svn://server/myproj/branches/feature-ZZZhgpullsvn将创建并使用命名分支'feature-ZZZ')


如果你不想“转换”但是“同步”,tonfa推荐hgsubversion,尽管它“由于重构而”目前处于不稳定的状态“:

  

目前 已准备好投入生产使用。如果你已经准备好攻击它,你应该只使用它,并潜入Mercurial和/或Subversion的内部。

由于hgsvn也允许通过hgpushsvnhgpullsvn进行一些同步...我现在会坚持使用hgsvn