使用Atlassian转换实用程序从SVN迁移到Git
示例
在此处下载Atlassian转换实用程序。该实用程序需要Java,因此请确保在计划进行转换的计算机上安装了JavaRuntimeEnvironmentJRE。
使用命令java-jarsvn-migration-scripts.jarverify检查您的计算机是否缺少完成转换所需的任何程序。具体来说,此命令检查Git,Subversion和git-svn实用程序。它还验证您是否在区分大小写的文件系统上执行迁移。迁移到Git应该在区分大小写的文件系统上完成,以避免损坏存储库。
接下来,您需要生成一个作者文件。Subversion仅按提交者的用户名跟踪更改。但是,Git使用两条信息来区分用户:真实姓名和电子邮件地址。以下命令将生成一个文本文件,该文件将Subversion用户名映射到其Git等效项:
java -jar svn-migration-scripts.jar authors <svn-repo> authors.txt
<svn-repo>您要转换的Subversion版本库的URL在哪里。运行此命令后,贡献者的标识信息将映射到中authors.txt。电子邮件地址的格式为<username>@mycompany.com。在authors文件中,您将需要手动将每个人的默认名称(默认情况下已成为其用户名)更改为其实际名称。在继续操作之前,请确保还要检查所有电子邮件地址的正确性。
以下命令将一个svn存储库克隆为一个Git:
git svn clone --stdlayout --authors-file=authors.txt <svn-repo> <git-repo-name>
其中,<svn-repo>是与上面使用的相同的存储库URL,并且<git-repo-name>是当前目录中将存储库克隆到的文件夹名称。使用此命令之前,有一些注意事项:
在--stdlayout上面标志告诉Git的,你正在使用一个标准的布局trunk,branches和tags文件夹。具有非标准布局的Subversion存储库要求您指定trunk文件夹,任何/所有branch文件夹和tags文件夹的位置。可以通过以下示例完成此操作:gitsvnclone--trunk=/trunk--branches=/branches--branches=/bugfixes--tags=/tags--authors-file=authors.txt<svn-repo><git-repo-name>。
完成此命令可能需要花费几个小时,具体取决于存储库的大小。
为了减少大型存储库的转换时间,可以直接在托管Subversion存储库的服务器上运行转换,以消除网络开销。
gitsvnclone将Subversion分支(和主干)导入为包含Subversion标签的远程分支(以开头的远程分支tags/)。要将它们转换为实际的分支和标记,请按照提供的顺序在Linux机器上运行以下命令。运行它们之后,gitbranch-a应显示正确的分支名称,并gittag-l应显示存储库标签。
git for-each-ref refs/remotes/origin/tags | cut -d / -f 5- | grep -v @ | while read tagname; do git tag $tagname origin/tags/$tagname; git branch -r -d origin/tags/$tagname; done git for-each-ref refs/remotes | cut -d / -f 4- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/origin/$branchname"; git branch -r -d "origin/$branchname"; done
从svn到Git的转换现在完成了!只需push将您的本地存储库发送到服务器,您就可以继续使用Git进行贡献,并拥有svn的完整版本历史记录。