我有一个具有以下布局的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等)。我认为这将丢失第一个导入项目的分支名称和标签。
答案 0 :(得分:6)
在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-ZZZ
,hgpullsvn
将创建并使用命名分支'feature-ZZZ
')
如果你不想“转换”但是“同步”,tonfa推荐hgsubversion
,尽管它“由于重构而”目前处于不稳定的状态“:
目前 已准备好投入生产使用。如果你已经准备好攻击它,你应该只使用它,并潜入Mercurial和/或Subversion的内部。
由于hgsvn
也允许通过hgpushsvn
和hgpullsvn
进行一些同步...我现在会坚持使用hgsvn
。