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

sim*_*imo 71 svn git version-control git-svn

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

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

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

J. *_*mon 48

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的不要使用git-svn!进行svn-to-git存储库转换,在那里他讨论了git-svn作为转换工具的缺点.)

关于你的第二个问题,它不是分支,Git的力量是如此有用(尽管Git在这方面至少与Subversion一样强大); 它是合并那些Git闪耀的分支.阅读Git社区手册,特别是第3章标题为" 基本分支和合并 "的部分以及第7章标题为" 高级合并 "的部分.


l0b*_*0b0 19

既然已经有很多人使用git-svn,我会说这很有可能.以下命令非常有名:

git svn clone -s http://svn/repo
Run Code Online (Sandbox Code Playgroud)

根据手册(在当地验证),这将保留"主干,标签和分支".

  • “-s”对我不起作用,它只是初始化存储库并且什么也不获取。手动获取也有同样的作用。删除“-s”,它就会滚动。 (2认同)

Nat*_*ate 11

2014年4月更新

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

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


一旦你转到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/
Run Code Online (Sandbox Code Playgroud)

http://www.example.com/svn-repo/Subversion存储库的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
Run Code Online (Sandbox Code Playgroud)

并且,如果你有一个主干,分支和标签文件夹,其命名与上面不同,你可以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
Run Code Online (Sandbox Code Playgroud)

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

cd projectA.git-svn
git push --mirror git@github.com:Account/projectA.git
Run Code Online (Sandbox Code Playgroud)

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


eck*_*kes 5

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

需要进行一些调整才能使标签正确,有关详细信息,请参阅此链接.

这个主题至少在此之前已经涉及过一次:
如何将svn分支和标签导入到git-svn中?