如何将代码从SVN迁移到GIT而不丢失提交历史?

我想知道将代码从SVN存储库转移到GIT存储库的推荐方式,以便我们转换开发人员团队并开始使用GIT。

我们可以进行转换,并保留SVN仓库中的所有提交吗?

另外,我们的团队目前对SVN感到满意,但他们并不知道GIT的分支比SVN容易得多,我在哪里可以find一个可以certificateGIT支持分支function的实例?

Eric Raymond(esr)创build了一个“版本控制历史上执行棘手编辑操作的命令解释程序”,它包括用于各种目的的脚本,包括清理VCS转换的结果。 从https://gitlab.com/esr/reposurgeon查看。;

从版本2.0开始,它支持读取SVN转储文件,以完成和惯用的翻译为Git,Mercurial 。 有关详细信息,请参阅http://esr.ibiblio.org/?p=4071 。 Reposurgeon已被用于将几个大型项目转换为Git,其中包括Emacs,其存储库ESR说:“分支结构庞大,复杂,并且已经足够老,已经开始了CVS回购的生活。 最后一部分是因为Subversion项目背后潜伏的一些最丑陋的翻译问题是由cvs2svn生成的奇怪的Subversion操作序列(包括分支复制操作的组合)。

(Git包含的git-svn工具可以处理许多Subversion版本库,包括分支,这是非常常用的,尤其是那些正在进行转换的团队,因为它允许Git像Subversion客户端那样工作, 不要用git-svn!做svn-to-git存储库转换 ,在那里他讨论git-svn作为转换工具的缺点。

关于你的第二个问题,在Git的力量是如此有帮助的地方并不是分支(尽pipe在这方面Git至less和Subversion一样强大)。 当谈到合并 Git发光的那些分支时。 仔细阅读Git社区书籍 ,特别是第3章“ 基本分支和合并 ”一节和第7章“ 高级合并 ”一节。

由于已经有很多人在使用git-svn ,所以我认为这是非常有可能的。 以下命令是众所周知的:

git svn clone -s http://svn/repo 

根据手册 (本地validation),这将保持“干线,标签和分支”。

2014年4月更新

有一个名为Svn2Git的工具,可以让这个过程变得更简单。 Github项目的文档非常好。 ( 需要Ruby

值得注意的是,虽然git-svn默认从你指定的path拉,而不是分支,标签和树干。 Svn2git则相反。 它将默认在path下寻找一个树干,分支和标签,你应该使用--nobranches--notags来告诉它不要search那些(虽然这可能会使svn2git的优势无效)。


一旦你转移到Git,我build议你移动每个人,并保持使用Git。 这更复杂,但过渡将是值得的。 Github.com支持使用Subversion客户端访问repo(但是您可能会失去Git分支的权力),这可能是一个很好的制止缺口。

我可以保留我的Subversion回购?

当你使用下面的方法移动时,所有当前的提交将保留在Subversion的回购中。 你可能能够从Subversion repo到Git repo进行单向同步,但是以另一种方式很快就会变得非常复杂。 我不build议尝试同步,只是一次性移动所有人。

Git有什么强大的function?

Git分支function强大,但并不是Git所有。 本地完整的历史logging意味着您可以尽全力使用Subversion,而无需联系服务器。 审查和search历史logging,撤消变更,本地提交,本地分支变得非常快。 Git也会压缩它的数据,所以一个Subversion签出(只包括最新版本)最终会和Git签出(包括完整的历史logging)大小差不多。 另外,因为数据在传输时被压缩,所以推拉也快得多。 不要只是推Git分支,把所有关于Git。

如何使用git svn方法来移动回购。

首先,克隆Subversion的回购。 这可能需要一段时间。

 git svn clone http://www.example.com/svn-repo/projectA/trunk/ 

http://www.example.com/svn-repo/是Subversion repo的URL, projectA/trunk/是你想要复制到Git的path。

如果你有一个标准的布局,比如projectA/trunkprojectA/branches/projectA/tags/ ,你可以添加--stdlayout并从一个目录中克隆起来,像这样

 git svn clone --stdlayout http://www.example.com/svn-repo/projectA/ projectA.git-svn 

而且,如果你有一个主干,分支和标签文件夹名称不同,然后上面,你给每个git svn clone自定义名称。

 git svn clone --trunk my-trunk --branches my-branches --tags my-tags http://www.example.com/svn-repo/projectA/ projectA.git-svn 

一旦完成所有你所要做的就是用--mirror推送到远程的git --mirror

 cd projectA.git-svn git push --mirror git@github.com:Account/projectA.git 

在这一点上,你应该使你的Subversion回购只读,以防止人们试图承诺过时的位置。

回购可以完全转换,包括标签和所有使用git svn clone分支。

有一些调整的标签正确,请参阅此链接了解更多信息。

这个话题至less在SO之前已经被覆盖过了:
如何导入svn分支和标签到git-svn?

从Svn到Git安全平稳的迁移方法是使用SubGit – 服务器端的Git / Svn同步工具。 可以将SubGit安装到Subversion版本库中,只要迁移过程持续,就可以同时使用Subversion和Git。

免责声明:我是SubGit的开发者,他已经使用SubGit已经有半年了。

我把我们的CVS仓库迁移回git,首先转换为颠覆,然后转移到git。 这在使用正确的工具时运行良好。

请参阅最健壮的方式将包含Eclipse项目的CVS存储库转换为git?

而且,完成后,严格testing。

对于git分支,这不是聪明的部分。 当你需要合并分支时,好处就来了。

约翰·阿尔宾(John Albin) 在这里和这里写了一些好的脚本,为你做整个转换(包括作者转换)。 脚本不完美(我有一些与多个分支hickups,尤其是与svn外部)。

实际上,Atlassian写了一个关于svn到git迁移的指南 (他们也在这些页面上有很好的教程)。

git是非常强大的,但有一个警告:到目前为止,git没有像svn:externals那么容易。 有替代品(混帐子树和git子模块),但他们从来没有像svn外部工作一样直观(但是这是另一个问题:看看在stackoverflow你会发现许多问题相关的这个话题)