有时候遇到很多开源的代码都是使用SVN仓库管理,对于习惯使用GIT的用户很是不方便,本文参考falcon的实现,记录自己的转换过程。
## 1. 准备GIT仓库
$ mkdir git-lib
$ cd git-lib
$ git svn init svn:[bsp_url]/[kernel] --no-metadata
在下载代码之前还必须建立好帐户的映射文件,这样SVN提交的LOG信息也会转换为GIT的commit形式,更详细的参数可以通过git help svn查看。
2. 制作帐户映射文件
$ cd path/to/svn-lib
$ svn log -q | grep '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq > svn-author.txt #svn 帐户
上述得到的是一些帐户名,在GIT中需要用户名与邮箱信息,因些必须手动关联上邮箱信息,针对有些人用户名与邮箱名不一样的情况这里不好区分,统一当一致处理
$ cd path/to/git-lib
$ awk '{print $1, "\t= ", $1, " <"$1"@xxx.com>"}' svn-author.txt > .git/svn/kf-svn.users.txt #关联用户信息
$ git config svn.authorsfile .git/svn/kf-svn.users.txt
加上邮箱后得到了GIT要求的用户名邮箱地址对帐号文件,添加到GIT配置,这里用户必须提前配置好,不在文件中的提交将不会被拉取到本地。
3. 下载代码仓库
$ cd path/to/git-lib
$ git svn fetch #抓取代码
$ git gc #压缩仓库
$ git log #查看更改信息
SVN仓库的所有更新默认都会合并到git-svn分支上,这里没有涉及到SVN仓库的tags和branch目录,这篇文章有介绍。
4. 后续更新
$ git checkout my_branch #切换到要更新的分支
$ git svn fetch #抓取服务器SVN仓库代码
$ git merge git-svn #合并更新到当前分支
PS: 使用这种方法只能跟踪SVN仓库的更新,并不能提交本地GIT的更新到SVN。或许可以,但现在我还不知道。