相信大家现在代码管理基本上都用git了,但是其实在很多年前,那个时候还是svn的天下。svn的出现大大的降低了代码管理的难度。
那为什么都2020年了,还要写一篇关于svn迁移git的文章呢,因为公司准备下线svn服务器了,我们项目组还有好多年前的svn代码要没处放了。开发中的项目现在基本了都用git了,但是那些老早前写的,已不维护的代码总要找个安身之处吧,总不能就丢掉吧。
项目组之前迁移svn代码的时候,很多人用的是简单粗暴的迁移方法,就是代码拷贝出来,在git上建项目,然后上传。好处就是简单,没有什么难度,缺点就是之前的commit代码记录都没有了。有时候看看大家代码提交记录还是能收获些什么。
所以做为程序员,怎么能接受这种方式的迁移呢,于是网上搜了一些方法,也找到了,不过千人千面,本人在使用过程中,还是发生了一些“不愉快”,也就是坑,网上找了一圈,有些坑也没有解决方法,只能自己解决。
话不多说,直接上步骤:
安装git等工具这个就不多说了找出所有svn上你们代码提交的user,当然如果你只要保留比如从某个版本到最新版本的提交记录,那只要找出这些版本之间的用户名,网上有打印出用户的方法,我这边是直接找出来,按照如下格式写在了一个txt文件中,比如user.txt user1=user1A<邮箱地址> user2=user2A<邮箱地址>"="左边user1是svn上的用户名称,右边user1A是git上的用户名称,一一对应即可。 放在比如目录:F:\svnback\user.txt下
运行git-bash.exe,为了确保不会权限问题出错,最好是用管理员运行假设我们要上传svn下的工程myproject,svn url为:https://svn.abc.com/type/myproject, 并且在git上创建出这个全新的myproject,路径为: https://g.git.com/type/myproject.git在svnback目录下创建全新目录myproject, 形成目录 :F:\svnback\myproject在打开git-bash.exe上用cd命令进入到/F/svnback 目录然后依次运行 # 从svn目录下获取代码提交记录 #注意 -r 10220:HEAD中的10220根据svn实际的label号填写,如果你要全部commit保留,那么整个"-r 10220:HEAD" 去掉即可 git svn clone -r 10220:HEAD https://svn.abc.com/type/myproject --no-metadata --authors-file=user.txt myproject #执行时间取决你的工程的大小,如果很大,这个时间会较长 #如果没有报错,则继续执行后面命令 #进入到myproject目录下 cd myproject #把刚下载的代码及提交记录添加到对应git上 git remote add origin https://g.git.com/type/myproject.git #查看添加情况,如果添加成功,用以下命令可以看到添加的结果: #一般会打印两条添加结果 git remote -v #为了后面push能成功,我们先pull一下 git pull --rebase origin master #最后一步,push到git git push -u origin master以上步骤如果没有问题,等待相应时间后,最终会成功,并且在git上会有所有的代码提交记录和代码本身,默认是push到master分支
**
**
在user.txt里没有添加全部你要保留的commit里的用户名,中途会失败,添加后重来错误:“Authentication Failed”,是在git没有缓存你的用户名密码,如果是windows的话,请打开系统的setting,Credential Manager(凭据管理器),找到Windows Credentials Manager(Windows凭据),找到你的git那个凭据进行修改比如麻烦的错误是这个: 0 [main] perl 18808 cygwin_exception::open_stackdumpfile: Dumping stack trace to perl.exe.stackdump # 或者是以下这个: 0 [main] perl 12736 cygwin_exception::open_stackdumpfile: Dumping stack trace to perl.exe.stackdump我在备份一些大项目时,一直报以上错误,然后也按照网上的解决方法,找到.git/config修改那个文件,添加了相应的行,比如:
[core] ...... #添加如下 hideDotFiles = dotGitOnly packedGitLimit = 4000m packedGitWindowSize = 4000m longpaths = true [http] postBuffer = 1048576000 [pack] deltaCacheSize = 2048m packSizeLimit = 2048m windowMemory = 2048m然后并没什么用,还是一直报。 最终我的解决方法是升级git,因为我之前一直用提2.10.2,可以打开git version查看,在一些大项目上怎么都不行。 后来升级到:2.28.0 解决了这个问题
再多讲一句,如果中途失败,要重来的话,一种方式是删除myproject目录下的所有文件,包括那个隐藏的.git目录。然后再重新执行一遍。 或者在myproject目录下执行:
#同理-r 10220:HEAD是可选的 git svn fetch -r 10220:HEAD