7月 162018
 

需求

工作里打算将代码从svn迁移到git,但svn毕竟用了一段时间,提交记录、tag、release等信息希望还能继续保留。

方案

git官方本身就给了一个教程,参见: Git与其他系统-迁移到Git

教程本身就交代了前因后果,我就不再赘述,基本按照流程走就可以,我这里只是说下我的步骤以及遇到的坑。

准备users.txt文件

我直接手写的,毕竟提交人不算多,也可以执行官方提供的命令: svn log ^/ --xml | grep -P "^<author" | sort -u | perl -pe 's/<author>(.*?)<\/author>/$1 = /' > users.txt

准备好users.txt之后,执行git svn clone命令

输入git svn clone命令后,在windows上后依次弹出3个输入框,依次输入: – windows用户验证框:输入windows登录密码
– svn用户名
– svn密码

输入后等待即可。

我执行的命令如下: git svn clone svn://xxx.xxx.xxx.xxx/yyy/ –no-metadata –authors-file=users.txt –no-minimize-url -s xxx git网页上给的命令,有提到--no-metadata是去掉svn的元数据,但如果不加入--no-minimize-url命令,git svn clone这条命令可能会去扫描更上层的svn目录。会有类似这样的提示信息: Initialized empty Git repository in /Users/doc/Test/Demo/.git/ Using higher level of URL: https://xxxxxxx/branch/android/project1 => https://xxxxxxxx/branch/android W: Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item: '/xxxxxxbranch/android' path not found W: Do not be alarmed at the above message git-svn is just searching aggressively for old history. This may take a while on large repositories ^Cecked through r290000

我记得如果你没权限的话会报错。保险起见,还是在命令行加入–no-minimize-url参数吧,主要是不缩小输入的地址。

报错:Author: xx not defined in users.txt file

如果你输入的authors.txt中用户映射没列全、svn的用户有遗漏,可能有如下报错: Author: xx not defined in users.txt file
此时记得修改authors.txt文件,删除整个文件夹,重新执行git svn clone命令。

注意

  • 请在一个空白的、没有与git或是svn关联的文件夹(最好就是新建一个文件夹)中执行git svn clone这条命令,否则操作结果可能比较怪,我一开始没留意,在一个git库中执行这命令,结果有点奇怪,就不多提了。
  • 这条命令的执行时间依赖于你的svn版本库内容的多寡,比如我迁移的svn大概用了半年多吧,提交记录、tag比较多,结果执行git svn clone这条命令大概执行了3个多小时……执行该命令时确保网络状况良好,然后你就可以去做别的事情了

git svn clone执行结束、没报任何错误的话,你会在你指定的文件夹内看到你想迁移的svn代码。接下来,按照git给的说明,继续执行后续命令,基本就没啥坑了,汇总命令列表见下面汇总

汇总

  1. 准备users.txt文件
  2. 准备好users.txt之后,执行git svn clone命令
  3. git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag “$tagname” “tags/$tagname”; git branch -r -d “tags/$tagname”; done
  4. git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch “$branchname” “refs/remotes/$branchname”; git branch -r -d “$branchname”; done
  5. git remote add origin xxxx 这里需要写上你自己的git远端地址,比如gitlab上你创建的项目地址
  6. git push origin –all
  7. git push origin –tags

基本流程就这样,还是比较简单的

参考帖子


 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)