一文讲述如何从SVN迁移至Git(Windows环境)

497 阅读3分钟

概述

本文概述了windows环境下如何使用git-svn来将我们的项目从SVN迁移至Git

准备迁移环境

在本地工作站上配置迁移环境并安装以下软件:

将源 SVN 存储库转换为本地 Git 存储库

检索所有 Subversion 作者的列表

若要从本地 Subversion 签出根目录提取所有 SVN 用户的列表,请运行以下 PowerShell 命令:

svn.exe log --quiet | ? { $_ -notlike '-*' } | % { "{0} = {0} <{0}>" -f ($_ -split ' \| ')[1] } | Select-Object -Unique | Sort-Object | Out-File 'authors-transform.txt' -Encoding utf8NoBOM

此命令将检索所有日志消息、提取用户名、消除任何重复用户名、对用户名进行排序,并将其放入 UTF-8 格式的 authors-transform.txt 文件中。 然后,可以编辑文件中的每一行,以创建 SVN 用户到格式正确的 Git 用户的映射。 例如,可将 jamal = jamal <jamal> 映射到 jamal = Jamal Hartnett <jamal@fabrikam-fiber.com>

使用 git-svn 克隆 Subversion 存储库

以下命令将使用在上一步中创建的 authors-transform.txt 文件执行标准 git-svn 转换。 它将 Git 存储库放置在本地计算机的 c:\mytempdir 文件夹中。

git svn clone ["SVN repo URL"] --prefix=svn/ --no-metadata --authors-file "authors-transform.txt" --stdlayout c:\mytempdir

--prefix=svn/ 是必需的,否则工具无法从导入的修订中判断 SVN 修订。 建议设置一个前缀(带有尾部斜杠),原因是因为 SVN 跟踪引用将位于 refs/remotes/$prefix/,这与 Git 自己的远程跟踪分支布局 (refs/remotes/$remote/) 兼容。

--no-metadata/告诉 git svn 不要包括 Subversion 通常会导入的元数据。

如果使用标准 trunk、分支、标记布局,只需使用 --stdlayout。 但是,如果使用的是其他布局,则可能需要传递 --trunk--branches 和 --tags 来找到具体是什么。如果你的项目中并没有trunk、branches、tags这些目录,你可以省略这些参数。使用如下命令:

git svn clone ["SVN repo URL"] --prefix=svn/ --no-metadata --authors-file "authors-transform.txt"  c:\mytempdir

导入后的清理工作

为了将标签变为合适的 Git 标签,运行

cp -Rf .git/refs/remotes/svn/tags/* .git/refs/tags/
rm -Rf .git/refs/remotes/svn/tags

接下来,将 refs/remotes 下剩余的引用移动为本地分支:

cp -Rf .git/refs/remotes/* .git/refs/heads/
rm -Rf .git/refs/remotes

因为我在使用时没有指定--trunk--branches 和 --tags这些参数,我检出完成后的分支名称是svn/git-svn,这里我们将分支重新命名为main:

git branch -m svn/git-svn main

然后我们切换至 main分支

git checkout main

将存储库推送到空 Git 存储库

  1. 在Git服务器上创建空仓库:
git init --bare myrepository.git
  1. 本地 Git 存储库推送到新的空 Git 存储库
git remote add origin git@my-git-server:myrepository.git
git push origin --all

至此我们就已成功的将项目从SVN成功迁移至Git了。若你并不想完全将远程存储仓库更换为Git,你也可以使用git svn将更改从本地 Git 存储库推送回 Subversion 存储库,更多关于git-svn的使用技巧就不在此赘述了。

参考资料