我想知道将代码从SVN存储库移动到GIT存储库的推荐方法,以便我们转换开发人员团队和开始使用GIT。
我们可以进行转换并在SVN存储库中完成所有提交吗?
此外,我们的团队目前对SVN感到满意,但是,他们不知道GIT中的分支比SVN容易得多,我在哪里可以找到一个证明GIT分支能力的实际例子?
答案 0 :(得分:47)
从版本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 repo到Git repo进行单向同步,但是以另一种方式进行非常快速的复杂化。我不建议尝试同步任何一种方式,只需一次性移动所有人。
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/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仓库。
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)