兴趣部落的 Git 迁移实践
因为历史原因,刚进小组时,组内主要利用 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 = 张三 <[email protected]> ... wangwu = 王五 <[email protected]>
上面的 zhangsan
就是 SVN 的 ID,后面对应的就是 username 和 email。有了 users.txt 的账号对应信息,下面可以迁移了:
git svn clone your-svn-url --authors-file=users.txt your-target-folder
也就是在迁移命令中加入 --authors-file
参数。
整体来看,迁移过程很顺利,没有很复杂的步骤。如果你在迁移中有什么困惑,可以去官网上瞧瞧。