使用Atlassian转换实用程序从SVN迁移到Git

示例

在此处下载Atlassian转换实用程序。该实用程序需要Java,因此请确保在计划进行转换的计算机上安装了Java Runtime Environment JRE。

使用命令java -jar svn-migration-scripts.jar verify检查您的计算机是否缺少完成转换所需的任何程序。具体来说,此命令检查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文件夹的位置。可以通过以下示例完成此操作:git svn clone --trunk=/trunk --branches=/branches --branches=/bugfixes --tags=/tags --authors-file=authors.txt <svn-repo> <git-repo-name>。

  • 完成此命令可能需要花费几个小时,具体取决于存储库的大小。

  • 为了减少大型存储库的转换时间,可以直接在托管Subversion存储库的服务器上运行转换,以消除网络开销。

git svn clone将Subversion分支(和主干)导入为包含Subversion标签的远程分支(以开头的远程分支tags/)。要将它们转换为实际的分支和标记,请按照提供的顺序在Linux机器上运行以下命令。运行它们之后,git branch -a应显示正确的分支名称,并git tag -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的完整版本历史记录。