将代码从 SVN 迁移到 GIT 并保留提交记录

第一步:用户映射

创建用户映射 (例如 users.txt) ,将 SVN 用户和 Git 用户对应起来,为保留提交记录做准备。

进入 SVN 的目录,执行如下命令,注意其中 $1\@tencent.com 部分应当替换为你实际的映射关系。

1
2
3
4
5
6
7
8
$ svn log --xml | grep -P "^<author" | sort -u | \
perl -pe 's/<author>(.*?)<\/author>/$1 = $1 <$1\@tencent.com>/' > users.txt

# 或

$ svn log -q svn+ssh://your/svn/path | \
awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2"@tencent.com>"}' | \
sort -u > users.txt

注意,生成的 users.txt 文件应当以 ANSI 编码保存,并且使用 CRLF 换行,您可以使用记事本另存为的功能选择该编码。

第二步:克隆代码

创建一个用于存放 Git 本地仓库的文件夹,如:E:/git,进入该文件夹,执行 clone 命令。

1
2
cd /e/git
git svn clone svn+ssh://your/svn/path -r 2000:HEAD --no-metadata --authors-file=users.txt --trunk=.

该步骤除了 clone 代码之外,还将导入所有的提交记录,执行较慢,需要耐心等待。中途出现找不到作者的情况时,可以修改 users.txt 补充该作者,重新再执行 git svn clone 命令。

详细命令参数,请参考 git svn help clone

执行完成之后,会在 E:/git 目录下创建以你 SVN path 最后一节为名称的子目录,可以进入该目录下的 .git 文件夹,执行 git log 命令查看提交记录。

第三步:提交到 GIT

这个步骤和常规地创建 GIT 仓库没有任何区别,直接添加远程仓库地址,push 即可:

1
2
git remote add origin http://your/remote/git/path.git
git push -u origin master

至此,代码及提交记录从 SVN 迁移到 GIT 的工作全部完成。

参考链接: