​因为历史原因,刚进小组时,组内主要利用 SVN 作为兴趣部落的代码托管工具,最近组里重新定义了一套代码 Review 规范,而 SVN 不能满足我们的需求,再加上公司的 Git 平台已经成熟可用,我们便萌生了将兴趣部落的代码从 SVN 迁移到 Git 上的念头。经过几天的努力,现在代码已迁移完成,下面就把过程与总结写下来供大家参考。

方法1

​先介绍一个简单粗暴的方法,TortoiseSVN 有自带的 Export 功能,可以将 SVN 的代码全部导出到一个新的文件夹下。下面简单描述下步骤,以 Github 为例。

​先在 Github 上建一个 repository,并将之 clone 到本地,假设文件夹叫 A。然后找到你要迁移的 SVN 项目,右击选择 TortoiseSVN -> Export,选择 A 文件夹,确定后 SVN 项目中的代码便到了 A 文件夹中,下面就可以将这个项目当做一般的 Git 项目来对待了。

​说这个方法简单粗暴,是因为这个方法其实跟将整个 SVN 项目的代码直接复制粘贴到 Git 项目文件夹下没多大差别,并且这次到 Github 上的提交会被当成整个项目的第一次提交,也就是以前的提交记录没有被迁移过来。

方法2

​如果你想做的完美一点,不仅迁移代码,还要迁移以前的提交记录,那应该怎么做呢?那就要用到 git-svn 了,详细文档请参考:git-svn

​使用 git svn clone your-svn-url your-target-folder 可以将 SVN 的主干代码以及提交记录拉取到了本地目标文件夹 your-target-folder 中。这种方式只能迁移一个特定文件夹的代码(一般迁移 trunk)。但如果你不仅想迁移主干代码,还想将 branch 和 tag 的代码一并迁移,你可以使用: git svn clone root-path --trunk="trunk/project" --branches=“branches” --tags="tags"。需要注意的是,trunk、branches 以及 tags 的路径是相对的。如果你的项目很庞大并且有很长的历史,那么迁移过程将会非常漫长(以天为单位)。如果你迁移过程中很幸运没遇见程序出错、电脑崩溃而最终成功的话,你可以执行 git branch -a 看看分支情况。因为我们没有迁移 branch 和 tag,所以不了解有什么坑。

​新的文件夹是没有 .gitignore 文件的,所以需要新建一个。

​当准备工作都做好后,下面可以将代码提交到远程仓库中:

git remote add origin your-git-repository
git push -u origin master

用户对应

​如果 SVN 的账号和 Git 的账号名称不一样,并且 SVN 中的账户就是一个 ID,而 Git 中的账号是 username 和 email,SVN 的 ID 可以和 Git 的 username 和 email 在迁移过程中对应起来,具体做法如下:

// 在 SVN 项目根目录:
svn log --xml | grep author | sort -u | perl -pe 's/.>(.?)<./$1 = /'

输出一列 SVN 用户列表,将之保存到 users.txt 中,并且修改账号对应关系,格式如下:

zhangsan = 张三 <zhangsan@tencent.com>
...
wangwu = 王五 <wangwu@tencent.com>

上面的 zhangsan 就是 SVN 的 ID,后面对应的就是 username 和 email。有了 users.txt 的账号对应信息,下面可以迁移了:

git svn clone your-svn-url --authors-file=users.txt your-target-folder

也就是在迁移命令中加入 --authors-file 参数。

​整体来看,迁移过程很顺利,没有很复杂的步骤。如果你在迁移中有什么困惑,可以去官网上瞧瞧。


CompileYouth
2.5k 声望105 粉丝