如何从复杂的subversion存储库迁移到分布式版本控制系统?

时间:2009-05-08 12:58:05

标签: svn git mercurial dvcs bazaar

假设我们有一个类似于

的subversion存储库
/original/0.1
/original/0.2
/variantA/trunk
/variantA/branches/who/branch_for_xxx
/variantA/branches/she/branch_for_yyy
/variantB/trunk
/variantB/branches/who/branch_for_zzz
(... 30 or 40 alike)

其中variantA和variantB是原始软件的分支。

我正在寻找一种将此存储库迁移到分布式版本控制系统的方法:方法

  • 不一定是单一命令
  • 用于任何一个众所周知的分布式版本控制系统
  • 让dvcs想到它们的分支:/official / {0.10.2.2}树,/ variantA / trunk树,...
  • 让dvcs知道这些树的继承关系

4 个答案:

答案 0 :(得分:3)

Mercurial附带一个转换扩展程序,可以做你想要的。请参阅convert extension details on the Mercurial web site.

答案 1 :(得分:2)

对于Git,请参阅http://github.com/guides/import-from-subversion

上的说明

我最后一次手动完成,我使用了以下命令。 (这是针对一个没有使用标签或分支的项目。如果你有标签或分支,使用svn2git可能比git-svn产生更好的结果。)

cat "mysvnusername = Me Myself <me.myself@somewhere.com>" >> authors.txt

svnserve --daemon --foreground --root <SVN-REPO-PARENT-DIR>
git svn clone --stdlayout --authors-file=authors.txt --no-metadata svn://localhost/<SVN-REPO-NAME>

# push to a public repo and clone from there, to get push/pull working easily
cd <SVN-REPO-NAME>
git remote add origin git@github.com:mygithubusername/<GIT-REPO-NAME>.git
git push origin master
cd ..
rm -rf <SVN-REPO-NAME>

git clone git@github.com:mygithubusername/<GIT-REPO-NAME>.git

但是由于你有一个非标准的SVN存储库布局,你需要为git svn clone指定--trunk,--tags和--branches参数而不是--stdlayout。

要表示存储库的整个继承历史记录,您可以尝试重新排序存储库,以便使用标准的平面存储库布局而不是非标准层次结构:

/branches/original-0.1
/branches/original-0.2
/branches/variantA-trunk
/branches/variantA-who-branch_for_xxx
/branches/variantA-she-branch_for_yyy
/branches/variantB-trunk
/branches/variantB-who-branch_for_zzz
...

这应该使导入工具更容易理解存储库。然后,当它们被导入时,您可以在新存储库中更好地重新组织它们。

另外,我听说Git 1.6.x支持深度克隆,因此您可以提供git svn clone参数,例如--branches=branches/*/*,这些参数将深入查看分支的层次结构。有关使用它的示例,请参阅this post

答案 2 :(得分:1)

如果您将 Git 视为可能的DVCS候选人,则ruby脚本 svn2git 可以满足您的需求。

问题中的更多详细信息:Cloning a Non-Standard Svn Repository with Git-Svn

答案 3 :(得分:1)

$ bzr svn-import --layout trunk1 svn-root-url bzr.repo

应该做正确的事。您需要安装bzr-svn插件才能执行此操作。