2

假设我们有一个 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​​.1,0.2} 树,/variantA/trunk 树,...
  • 让 dvcs 知道这些树的继承关系
4

4 回答 4

3

Mercurial 带有一个转换扩展,它应该可以满足您的需求。请参阅Mercurial 网站上的转换扩展详细信息。

于 2009-05-26T15:04:56.713 回答
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/*/*可以深入查看分支层次结构的参数。有关使用它的示例,请参见这篇文章。

于 2009-05-08T16:39:37.710 回答
0

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

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

于 2009-05-08T16:35:59.060 回答
0

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

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

于 2009-05-08T17:05:14.357 回答