我阅读了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
我不希望它这么简单,也不希望它是一个命令。但我确实希望它不要试图解释任何事情——只是说在这个例子中应该采取什么步骤。
如果您正在使用SourceTree,则可以直接从应用程序执行此操作。转到文件->新建/克隆,然后执行以下操作:
输入远程SVN URL作为“源路径/URL”。在提示时输入凭据。输入本地文件夹位置作为“目标路径”。给它起个名字。在高级选项中,从“创建本地”下拉列表中选择“Git”类型的存储库”。您可以选择指定要从中克隆的修订。点击克隆。
在SourceTree中打开回购,您将看到您的提交消息也已迁移。
现在转到存储库->存储库设置并添加新的远程存储库详细信息。如果您愿意,请删除SVN远程(我通过“编辑配置文件”选项执行此操作)。
准备好后,将代码推送到新的远程存储库,并自由编码。
我已经发布了一个将svn转换为git的分步指南(这里),包括将svn标记转换成git标记,将svn分支转换成git分支。
简短版本:
1) 从特定版本号克隆svn。(修订号必须是要移植的最旧版本)
git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame
2) 获取svn数据。这一步是最耗时的一步。
cd gitreponame
git svn fetch
重复git-svn获取,直到无错误完成
3) 更新主分支
git svn rebase
4) 通过复制引用从svn分支创建本地分支
cp .git/refs/remotes/origin/* .git/refs/heads/
5) 将svn标记转换为git标记
git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done
6) 将存储库放在更好的地方,如github
git remotes add newrepo git@github.com:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo
如果你想了解更多细节,请阅读我的帖子或询问我。
这里有一个简单的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上(秘诀是——关注标签)。
最后,我拼凑了两个简短而简单的脚本,上面链接了起来,效果很好。解决方案不需要比这更复杂!
只使用git、SVN和bash的稍微扩展的答案。它包括SVN存储库的步骤,这些存储库不使用带有主干/分支/标签目录布局的常规布局(SVN绝对不执行这种布局)。
首先使用此bash脚本扫描SVN repo以查找不同的贡献者,并为映射文件生成模板:
#!/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
使用此选项可以创建一个作者文件,在该文件中,您可以使用git-config财产user.name和user.email将svn用户名映射到开发人员设置的用户名和电子邮件(请注意,对于GitHub这样的服务,只有匹配的电子邮件就足够了)。
然后让git-svn将svn存储库克隆到git存储库,告诉它映射:
git-svn clone--authors file=authors--stdlayoutsvn://example.org/Folder/projectroot
这可能需要非常长的时间,因为git-svn将单独检查存在的每个标记或分支的每个修订。(请注意,SVN中的标记实际上只是分支,因此它们在Git中最终也是如此)。您可以通过删除SVN中不需要的旧标记和分支来加快速度。
在同一网络中的服务器上或同一服务器上运行它也可以真正加快速度。此外,如果由于某种原因,此过程中断,您可以使用
git-svn-rebase--继续
在很多情况下,你已经在这里完成了。但是,如果您的SVN回购有一个非传统的布局,您只需在SVN中有一个目录,就可以将其放入git分支中,那么您可以执行一些额外的步骤。
最简单的方法是在服务器上创建一个新的SVN repo,它遵循惯例,并使用SVN副本将目录放在主干或分支中。如果您的目录完全位于repo的根目录,这可能是唯一的方法,当我上次尝试这个git-svn时,它只是拒绝执行签出。
您也可以使用git执行此操作。对于git-svn克隆,只需使用您想要放入git分支的目录。
运行后
git branch --set-upstream master git-svn
git svn rebase
注意,这需要Git1.7或更高版本。