将 SVN 仓库转换成 Git 仓库

前言

由于习惯了 Git 代码版本控制工具的便利,最近接手公司老项目都是使用 SVN,缺点就不说了,实在受不了这种古董级到代码版本控制工具。所以今天抽了时间,将 SVN 转换到 Git 仓库,以下记录操作记录。

一、 获取原 SVN 仓库使用的用户名字列表

SVN 中,每个用户提交时都需要在系统中有一个用户,用于记录在提交信息中。但是这些用户仅有用户名,与 Git 的默认格式有些差异,所以需要先获取原仓库的用户信息,然后修改成符合 Git 格式这些信息的格式和内容与 Git 默认的格式和内容略有差别,所以我们需要去获得原 SVN 仓库使用的用户名字列表信息并做格式改动。

进入到 SVN 项目工作目录中,执行以下命令获取原用户列表:

1
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

执行完改命令,会在当前目录生成 users.text 文件,格式看起来像下面这样

1
2
3
Joe = Joe <Joe>
Lisen = Lisen <Lisen>
Zl = Zl <Zl>

我们需要将它修改成 Git 的格式,为每个用户添加 Email

1
2
3
Joe = Joe <[email protected]>
Lisen = Lisen <[email protected]>
Zl = Zl <[email protected]>

二、 生成 Git 仓库

利用 Git 内置的 git svn 命令克隆 SVN 仓库

1
git svn clone --stdlayout --no-metadata -A user.txt https://192.168.1.50/svn/Repo/ RepoDir

--stdlayout: 示你的项目在 SVN 中是常见的 “trunk/branches/tags” 目录结构,如果不是,那你需要使用 –tags, –branches, –trunk 参数(请通过 git svn help 自行了解)。
--no-metadata: 让原 SVN 项目日志中的内容更符合 Git 的格式规范,且去掉了 SVN ID、URL 此类无用信息。
-A user.txt: -A 为指定用户列表信息。user.txt 为用户列表信息的文件。如果 user.txt 不当前目录,可以改为具体路径,例如 -A /Users/joe/Desktop/user.txt
https://192.168.1.50/svn/Repo/: 表示 SVN 的仓库服务器地址。
RepoDir: 为目标目录,这将会在 RepoDir 新建一个 Git repo,并开始从 SVN 中拉取代码。

如果遇到以下错误

1
Author: VisualSVN Server not defined in userinfo.txt file

user.txt 文件里添加以下内容即可

1
VisualSVN Server = Visual SVN Server <[email protected]>

如果原仓库比较大,时间可能需要一定时间,等待获取完,生成好的 Git 仓库将放在您指定的目录中。

如果需要获取其他分支,可以参考下面的链接.

Done.

参考资料

1、将代码库从 SVN 迁移至 Git 并保留所有 commit 记录
2、如何将 SVN 仓库代码导入 CODING

感谢您的阅读,本文由 Joe 版权所有。如若转载,请注明出处:Joe(http://aidevjoe.github.io/2019/03/22/将 SVN 仓库转换成 Git 仓库/
使用 expect 自动化部署项目