假设我们有一个类似于
的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是原始软件的分支。
我正在寻找一种将此存储库迁移到分布式版本控制系统的方法:方法
答案 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插件才能执行此操作。