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

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

使用命令 java -jar svn-migration-scripts.jar verify 检查你的机器是否缺少完成转换所需的任何程序。具体来说,此命令检查 Git,subversion 和 git-svn 实用程序。它还会验证你是否在区分大小写的文件系统上执行迁移。应该在区分大小写的文件系统上迁移到 Git,以避免破坏存储库。

接下来,你需要生成一个 authors 文件。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 repo 克隆为 Git:

git svn clone --stdlayout --authors-file=authors.txt <svn-repo> <git-repo-name>

其中 <svn-repo> 与上面使用的存储库 URL 相同,<git-repo-name> 是当前目录中用于克隆存储库的文件夹名称。使用此命令之前有一些注意事项:

  • 上面的 --stdlayout 标志告诉 Git 你正在使用 trunkbranchestags 文件夹的标准布局。具有非标准布局的 Subversion 存储库要求你指定 trunk 文件夹,any / all 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 分支(和 trunk)作为远程分支导入,包括 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 的转换现已完成! 只需将你的本地仓库发送到服务器,你就可以继续使用 Git 进行贡献,并从 svn 获得完全保留的版本历史记录。