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

时间:2012-02-09 10:50:18

标签: git svn version-control git-svn

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

我们可以进行转换并在SVN存储库中完成所有提交吗?

此外,我们的团队目前对SVN感到满意,但是,他们不知道GIT中的分支比SVN容易得多,我在哪里可以找到一个证明GIT分支能力的实际例子?

7 个答案:

答案 0 :(得分:47)

Eric Raymond(esr)创建了reposurgeon,“用于对版本控制历史执行棘手编辑操作的命令解释程序。”该工具包含用于各种目的的脚本,包括清理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客户端。但请参阅ESR的Don’t do svn-to-git repository conversions with git-svn!,其中讨论了git-svn作为转换工具的缺点。)

关于你的第二个问题,它不是分支,Git的力量是如此有用(尽管Git在这方面至少与Subversion一样强大);当它涉及合并那些Git闪耀的分支时。请仔细阅读Git Community Book,特别是第3章标题为“Basic Branching and Merging”的部分和第7章标题为“Advanced Merging”的部分。

答案 1 :(得分:18)

由于已经有很多人使用git-svn,我认为这很有可能。以下命令非常有名:

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

根据manual(在本地验证),这将保留“主干,标签和分支”。

答案 2 :(得分:11)

2014年4月更新

有一个名为Svn2Git的工具可以很好地简化这个过程。关于Github项目的文档非常好。 (需要Ruby

值得注意的是,虽然git-svn默认只从你指定的路径拉出,而不是分支,标签和主干。 Svn2git正好相反。它将默认在路径下查找主干,分支和标签,您应该使用--nobranches--notags告诉它不要搜索那些(尽管这可能会使svn2git的优势无效)。 / p>


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

我可以保留我的Subversion回购吗?

当您使用以下方法移动时,所有当前提交都将保留在Subversion仓库中。您可以从Subversion repo到Git repo进行单向同步,但是以另一种方式进行非常快速的复杂化。我不建议尝试同步任何一种方式,只需一次性移动所有人。

Git有什么强大功能?

Git分支功能强大但并不是Git的全部功能。在本地拥有完整的历史记录意味着您可以使用Subversion执行所有操作,但无需联系服务器。查看和搜索历史记录,撤消更改,在本地提交,在本地分支变得非常快。 Git也压缩它的数据,因此Subversion结帐(仅包括最新版本)最终与Git结账大小相同(包括完整历史记录)。此外,由于数据在传输时被压缩,因此推拉也快得多。不要只是推Git分支,把所有关于Git。

如何使用git svn方法移动仓库。

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

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

其中http://www.example.com/svn-repo/是Subversion repo的URL,projectA/trunk/是您要复制到Git的路径。

如果你有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仓库。

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

此时,您应该将Subversion repo设为只读,以防止人们尝试提交过时的位置。

答案 3 :(得分:5)

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

需要进行一些调整以确保标记正确,有关详细信息,请参阅this link

此处已至少在此处讨论过此主题一次:
How to import svn branches and tags into git-svn?

答案 4 :(得分:2)

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

免责声明:我是SubGit的开发人员,已经半年愉快地使用SubGit。

答案 5 :(得分:1)

我将我们的CVS存储库迁移回git,首先转换为subversion然后转换为git。当使用正确的工具时,这很有效。

请参阅Most robust way to convert a CVS repository containing Eclipse projects to git?

此外,完成后,严格测试。

关于git分支,这不是智能部分。当您需要合并分支时,优势就来了。

答案 6 :(得分:1)

John Albin写了一些好的脚本herehere,它们将为您完成整个转换(包括作者转换)。这些脚本并不完美(我有一些带有多个分支的hickup,尤其是svn externals)。

Atlassian实际上在svn上写了一个guide来进行git迁移(他们也在这些页面上有很好的教程)。

git是非常强大的,但有一点需要注意:到现在为止,git没有像svn那样简单的东西:外部。有替代方案(git子树和git子模块),但它们从不像svn externals那样直观地工作(但这是另一个问题:在stackoverflow上查看,你会发现许多与此主题相关的问题)