我有一个具有以下布局的 subversion 存储库:

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


我想将其转移到具有修改后布局的 Mercurial 存储库:
hgrepo/projectA
hgrepo/projectB

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

选项1

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

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

然后在 svnrepo/trunk 上进行 hg 转换。这会混淆 hg 导入吗?

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

有帮助吗?

解决方案

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

  • 合并非常复杂。合并将取决于所做的更改 全部 项目,而不仅仅是您要合并的项目。
  • 导致存储和签出开销——据我所知,Mercurial 不支持仅签出存储库的子目录。您必须立即对所有项目进行分支。

解决方案是将单个 Subversion 存储库转换为多个 Mercurial 存储库。大多数转换工具都支持这一点。

其他提示

每个项目应该是在它自己的汞库(以能得到或标签只是一个具体的项目)。

记住比你在Subversion中看到目录(主干,标签,分支)将不会在任何现代(d)VCS,其中分支和标签都是一等公民存在(即元数据直接由工具管理),作为置作为来自的便宜的副本所得的简单目录(在SVN)。

这意味着,当您转换一个SVN仓库,你不应该直接存储任何“主干”,“标签”或“分支”目录中的汞回购的历史。

您应该宁可使用工具进口您的SVN回购(如只是“回购/了projectA”)为汞回购奉献给了projectA。它会保持标签和一部开拓创新SVN项目的分支,并将其转换成汞对象。结果 从其文档

  

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


如果你不想 “转换”,而是 “同步”,推荐的 <强> hgsubversion ,虽然 “是目前在磁通的状态由于重重构”:

  

现在它是的的可供生产使用。如果你准备砍它,去潜水进入水银和/或颠覆的内部时,才应使用此。

由于hgsvn也让部分通过hgpushsvnhgpullsvn同步......我会坚持hgsvn现在。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top