如何在不丢失提交历史的情况下将代码从SVN迁移到GIT?

如何在不丢失提交历史的情况下将代码从SVN迁移到GIT?,git,svn,version-control,git-svn,Git,Svn,Version Control,Git Svn,我想知道将我们的代码从SVN存储库移动到GIT存储库的推荐方法,以便我们转换开发人员团队并开始使用GIT 我们可以在SVN存储库中进行转换并保持所有提交吗 另外,我们的团队目前对SVN很满意,但是,他们不知道GIT中的分支比SVN容易得多,我在哪里可以找到一个实际的例子来证明GIT在分支中的威力?我将CVS存储库迁移回GIT,先转换到subversion,然后再转换到GIT。这在使用正确的工具时效果很好 看 此外,完成后,严格测试 关于git分支,这不是明智的部分。当你需要合并分支时,优势就来了

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

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


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

我将CVS存储库迁移回GIT,先转换到subversion,然后再转换到GIT。这在使用正确的工具时效果很好

此外,完成后,严格测试


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

因为已经有很多人在一起工作,我认为这是非常可能的。下面的命令是众所周知的:

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

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

可以完全转换回购,包括使用git svn克隆的标记和所有分支

要获得正确的标记,需要进行一些调整,请参阅以获取更多信息

此主题在此之前至少讨论过一次:

Eric Raymond(esr)创建了“用于对版本控制历史执行复杂编辑操作的命令解释器”。该工具包括用于各种目的的脚本,包括清理VCS转换结果。请从中查看

从版本2.0开始,它包括对读取SVN转储文件的支持,以便将其完整、惯用地翻译成Git、Mercurial等。;有关详细信息,请参阅。Repositor已经被用于将几个大型项目转换为Git,包括Emacs,其存储库,ESR说,“规模大,分支结构复杂,已经足够老了,可以作为CVS回购开始生活。最后一部分很重要,因为在Subversion项目的历史中潜伏的一些最丑陋的翻译问题是由cvs2svn生成的奇怪的Subversion操作序列(包括分支复制操作的组合)。”

(git附带的git svn工具将处理许多Subversion存储库,包括分支。它非常常用,尤其是在进行转换的团队中,因为它允许git充当Subversion客户端。但请参阅ESR,他在其中讨论了git svn作为转换工具的缺点。)


关于你的第二个问题,Git的功能如此有用的地方并不是分支(尽管Git在这方面至少与Subversion一样强大);而是当涉及到合并这些分支时,Git才大放异彩.

从Svn到Git的安全、平稳的迁移方法是使用服务器端Git/Svn同步工具。可以将SubGit安装到Subversion存储库中,并在迁移过程持续期间继续同时使用Subversion和Git

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

2014年4月更新

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

值得注意的是,虽然git svn默认只从您指定的路径提取,而不是分支、标记和主干。Svn2git则相反。它默认在路径下查找主干、分支和标记,您应该使用
--nobranches
--notags
告诉它不要搜索这些(尽管这可能会抵消svn2git的优势)


一旦你转向Git,我建议你转移所有人并继续使用Git。这更复杂,但转换是值得的。Github.com支持使用Subversion客户端访问repo(但你可能会失去Git分支的能力),这可能是一个很好的权宜之计

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

Git的强大之处是什么? Git分支功能强大,但它并不是Git的全部功能。在本地拥有完整的历史记录意味着您可以使用Subversion做任何事情,但无需联系服务器。查看和搜索历史记录、撤消更改、在本地提交、在本地分支变得非常快。Git还压缩其数据,因此ubversion签出(仅包括最新版本)最终与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/branchs/
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 repo

cd projectA.git-svn
git push --mirror git@github.com:Account/projectA.git
在这一点上,您应该将Subversion repo设置为只读,以防止人们访问