如何将具备历史记录的SVN存储库迁移到新的Git存储库?

我阅读了Git手册,常见问题解答,Git-SVN崩溃课程等,它们都对此进行了解释,可是在任何地方都找不到像这样的简单说明: html

SVN存储库位于: svn://myserver/path/to/svn/repos git

Git存储库位于: git://myserver/path/to/git/repos github

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

我不但愿它那么简单,也不但愿它是单个命令。 但我确实但愿它不会尝试解释任何内容-仅说明在此示例中应采起的步骤。 shell


#1楼

GitHub如今具备从SVN存储库导入的功能。 我历来没有尝试过。 windows


#2楼

另外,当尝试使用git-svn dcommits进行git时,git-stash命令是天赐的礼物。 bash

典型过程: 服务器

  1. 设置git repo
  2. 在不一样的文件上作一些工做
  3. 决定使用git检查一些工做
  4. 决定svn-dcommit
  5. 获取可怕的“没法提交带有脏索引的错误”错误。

解决方案(须要git 1.5.3+): 网络

git stash; git svn dcommit ; git stash apply

#3楼

TortoiseGit作到了。 请参阅此博客文章: http : //jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients app

是的,我知道用连接回答不是很出色,但这是一种解决方案,是吗? svn


#4楼

仅使用git,SVN和bash的扩展答案。 它包括不使用Trunk / Branches / tags目录布局使用常规布局的SVN存储库的步骤(SVN绝对不执行这种布局)。

首先使用此bash脚本扫描您的SVN存储库,以查找作出贡献的不一样人员,并生成映射文件的模板:

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <USER@DOMAIN>";
done

使用它建立一个authors文件,在其中将svn用户名映射到开发人员使用git config属性user.nameuser.email设置的svn用户名和电子邮件(请注意,对于GitHub这样的服务,仅具备匹配的电子邮件就足够了)。

而后让git svn将svn存储库克隆到git存储库,并告诉它有关映射的信息:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

因为git svn会分别检出存在的每一个标记或分支的每一个修订,所以这可能会花费很是长的时间。 (请注意,SVN中的标签实际上只是分支,所以它们最终会在Git中结束)。 您能够经过删除不须要的SVN中的旧标签和分支来加快此过程。

在同一网络或同一服务器上的服务器上运行它也能够真正加快此过程。 另外,若是因为某种缘由该过程被中断,您能够使用

git svn rebase --continue

在不少状况下,您已经在这里完成了。 可是,若是您的SVN存储库具备很是规的布局,而您仅想在SVN中有一个目录,您想要放入git分支,则能够执行一些额外的步骤。

最简单的方法是在服务器上制做一个遵循约定的新SVN存储库,并使用svn copy将目录放置在主干或分支中。 若是您的目录一直位于仓库的根目录,这多是惟一的方法,当我上次尝试此git svn只是拒绝执行签出操做。

您也可使用git执行此操做。 对于git svn clone只需使用要放入git分支的目录便可。

运行后

git branch --set-upstream master git-svn
git svn rebase

请注意,这须要Git 1.7或更高版本。


#5楼

这是一个没有依赖关系的简单shell脚本,它将一个或多个SVN存储库转换为git并将其推送到GitHub。

https://gist.github.com/NathanSweet/7327535

在大约30行脚本中:使用git SVN进行克隆,从SVN :: ignore属性建立一个.gitignore文件,推送到裸git仓库,将SVN干线重命名为master,将SVN标签转换为git标签,而后将其推送到GitHub同时保留标签。

我很费力地将十几个SVN存储库从Google Code迁移到GitHub。 我使用Windows并无帮助。 Ruby在个人旧Debian盒子上坏透了,让它在Windows上运行真是个笑话。 其余解决方案没法与Cygwin路径配合使用。 即便我能够正常工做,也没法弄清楚如何在GitHub上显示标签(秘密是--follow-tags)。

最后,我将上面连接的两个简短脚本拼凑在一块儿,效果很好。 解决方案不须要比这更复杂!