如何将代码从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/trunk
, projectA/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你会发现许多问题相关的这个话题)