我阅读了Git手册、常见问题解答、Git-SVN速成课程等,他们都解释了这一点和那一点,但你找不到像这样的简单说明:

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

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

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

我不希望它这么简单,也不希望它是一个命令。但我确实希望它不要试图解释任何事情——只是说在这个例子中应该采取什么步骤。


当前回答

将Subversion存储库干净地迁移到Git存储库。首先,您必须创建一个将Subversion提交作者名称映射到Git commiters的文件,比如~/authors.txt:

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

然后您可以将Subversion数据下载到Git存储库中:

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

如果您在Mac上,可以通过安装git-core+svn从MacPorts获取git-svn。

如果您的subversion存储库与所需的git存储库位于同一台机器上,那么您可以在init步骤中使用此语法,否则都一样:

git svn init file:///home/user/repoName --no-metadata

其他回答

这里有一个简单的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上(秘诀是——关注标签)。

最后,我拼凑了两个简短而简单的脚本,上面链接了起来,效果很好。解决方案不需要比这更复杂!

SubGit(vs死亡蓝屏)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

这就是全部。

+要从SVN更新,通过第一个命令创建Git存储库。

subgit import  directory/path/Local.git.Repo

我使用了一种方法来立即迁移到Git,以创建一个巨大的存储库。当然,你需要一些准备。但你可能根本不会停止开发过程。

这是我的路。

我的解决方案如下:

将SVN迁移到Git存储库在团队切换到之前更新Git存储库。

对于大型SVN存储库,迁移需要大量时间。但完成迁移的更新仅需几秒钟。

当然,我在使用SubGit,妈妈。gitsvn让我成为蓝屏死亡。只是不断。git-svn让我厌烦git的“文件名太长”致命错误。

步骤

1.下载SubGit

2.准备迁移和更新命令。

假设我们是为Windows做的(移植到Linux很简单)。在SubGit的安装bin目录(subbit-2.X.X\bin)中,创建两个.bat文件。

用于迁移的文件/命令的内容:

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

“start”命令在这里是可选的(Windows)。它将允许在启动时看到错误,并在SubGit完成后打开一个shell。

您可以在这里添加类似于git-svn的其他参数。我只使用默认域myCompanyDomain.com来修复SVN作者电子邮件地址的域。我有标准的SVN存储库结构(主干/分支/标签),我们在“作者映射”方面没有问题。所以我什么都不做了。

(如果你想迁移像分支这样的标记,或者你的SVN有多个分支/标记文件夹,你可以考虑使用更详细的SubGit方法)

技巧1:使用--最小修订版YourSvnRevNumber快速查看事情的发展(某种调试)。特别有用的是查看已解析的作者姓名或电子邮件。或者限制迁移历史深度。

提示2:迁移可能会被中断(Ctrl+C),并通过运行下一个更新命令/文件来恢复。我不建议对大型存储库这样做。我收到了“内存不足Java+Windows异常”。

技巧3:最好创建结果裸存储库的副本。

用于更新的文件/命令的内容:

start    subgit import  directory/path/Local.git.Repo

当您想获得最后一个团队对Git存储库的提交时,可以随时运行它。

警告不要触摸您的裸存储库(例如创建分支)。您将出现下一个致命错误:

无法恢复的错误:不同步,无法同步。。。正在将Subversion修订转换为Git提交。。。

3.运行第一个命令/文件。对于一个大仓库来说,这需要很长时间。我简陋的仓库需要30小时。

这就是全部。通过运行第二个文件/命令,您可以随时从SVN更新Git存储库。在将开发团队切换到Git之前。只需要几秒钟。



还有一项更有用的任务。

将本地Git存储库推送到远程Git存储

这是你的情况吗?让我们继续。

配置遥控器

Run:

$ git remote add origin url://your/repo.git

准备将巨大的本地Git存储库首次发送到远程存储库

默认情况下,Git无法发送大块数据。致命:远端意外挂断

让我们跑吧:

git config --global http.postBuffer 1073741824

524288000-500 MB1073741824-1 GB等。

修复本地证书问题。如果您的git服务器使用了损坏的证书。

我已禁用证书。

此外,您的Git服务器可能存在需要更正的请求量限制。

将所有迁移推送到团队的远程Git存储库。

使用本地Git运行:

git push origin --mirror

(git push origin“*:*”用于旧git版本)

如果出现以下错误:error:无法派生git:没有这样的文件或目录。。。对我来说,完全重新创建存储库解决了这个错误(30小时)。您可以尝试以下命令

git push origin --all
git push origin --tags

或者尝试重新安装Git(对我来说没用)。或者您可以从所有标签创建分支并推送它们。或者,或者,或者。。。

GitHub现在具有从SVN存储库导入的功能。但我从未尝试过。

这里的几个答案涉及https://github.com/nirvdrum/svn2git,但对于大型存储库,这可能会很慢。我试过使用https://github.com/svn-all-fast-export/svn2git相反,它是一个同名的工具,但用于将KDE从SVN迁移到Git。

设置它的工作稍微多了一些,但当为我完成转换时,其他脚本花费了数小时的时间。

我只是想把我的贡献加入Git社区。我编写了一个简单的bash脚本,可以自动完成整个导入。与其他迁移工具不同,该工具依赖于原生git而不是jGit。该工具还支持具有较大修订历史和/或较大Blob的存储库。可通过github获得:

https://github.com/onepremise/SGMS

此脚本将以以下格式转换存储在SVN中的项目:

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

该方案也很受欢迎和支持:

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

每个项目将按项目名称同步:

Ex: ./migration https://svnurl.com/basepath project1

如果要转换完整回购,请使用以下语法:

Ex: ./migration https://svnurl.com/basepath .