背景
项目代码管理初始使用的svn, 由于svn代码操作,无法在本地暂存,有诸多不便,另外本人习惯使用git. 所以决定迁移至git管理
迁移要求:
保留历史提交记录
迁移流程
代码检出
git svn svn_project_url
git代码提交
修改本地代码,使用git add/commit将修改提交到本地git库
git add/commit
同步svn更新
定期使用git svn rebase获取中心svn repository的更新
git svn rebase
git本地更新,同步至svn
使用git svn dcommit命令将本地git库的修改同步到中心svn库
git svn dcommit
其他
检出一个已存在svn repository(类似于svn checkout)
一般情况下git svn clone这个操作会从第一个版本开始同步,如果版本号已经到了好几万(或更高),这个操作会相当的费时。这时可以使用参数-r$REVNUMBER:HEAD检出指定版本后的代码。
因此,更好的步骤应该是这样:
svn info svn_repository_url, 记录最后的版本号,假设是220
假设要检出最后20个版本,做个简单的减法: 220 – 20 = 200
开始clone操作了:git svn clone -r200:HEAD svn_repository_url
git svn clone -r200:HEAD svn_repository_url
从中心服务器的svn repository获取最新更新
这个操作可以通过”git svn rebase”完成。注意这里用的是rebase,而不是update。update命令对于通过git svn检出的svn repostory的git版本库是不可用的。
查看提交历史日志
使用”git svn log”,加上-v选项,还可以提供每次commit操作涉及的相关文件的详细信息。
git svn log
将本地代码同步到Svn服务器
通过”git svn dcommit”命令。这个命令会将你在本地使用git commit提交到本地代码库的所有更改逐一提交到svn库中。加上-n选项,则该命令不会真正执行commit到svn的操作,而是会显示会有哪些本地 变动将被commit到svn服务器。git svn dcommit似乎不能单独提交某个本地版本的修改,而是一次批量提交所有与svn中心版本库的差异。
提交时的冲突解决
如果你正在提交的文件在svn服务器上已经被别人改过,就会发生提交冲突。通常解决方法如下:
首先使用git svn rebase获取svn服务器上的最新冲突文件,比如:demo.java,这将导致与本地demo.java冲突,不过此时svn版本信息已经添加到本地git库中(通过git log可以查看),git svn rebase提示你在解决demo.java的冲突后,运行git rebase –continue完成rebase操作
打开demo.java,修改代码,解决冲突
执行git rebase –continue,git提示:You must edit all merge conflicts and then mark them as resolved using git add
执行git add demo.java,告知git已完成冲突解决
再次执行git rebase –continue,提示”Applying: git xxx”,此时”git xxx”版本又一次成功加入本地版本库,可通过git log查看;
执行git svn dcommit将demo.java的改动同步到svn中心库,到此算是完成一次冲突解决。
尽量在线模拟验证后,再迁移项目
svn在线托管网址
SVNBucket - SVN仓库,免费 SVN 代码托管服务器,不限私有,不限成员SVNBucket是一个SVN代码托管平台,提供了可视化的管理界面,让操作变得简单、方便,超大在线SVN空间。知名厂商 OPPO 的选择,安全稳定、长久运营、放心使用。不限私有项目、不限成员数量,支持文件级权限控制、SVN 钩子https://svnbucket.com/
git在线托管网址
Gitee - 基于 Git 的代码托管和研发协作平台面向企业提供一站式研发管理解决方案,包括代码管理、项目管理、文档协作、测试管理、CICD、效能度量等多个模块,支持SaaS、私有化等多种部署方式,帮助企业有序规划和管理研发过程,提升研发效率和质量。https://gitee.com
祝顺利