实操 Svn 迁移到 Git
扫描二维码
随时随地手机看文章
来源:segmentfault
不管是软件工程师,还是硬件工程师,基本都会牵涉到版本管理的问题。市面上版本管理的工具很多,但大家最熟悉的可能还是Svn和Git了。
以前很多工程师都习惯使用SVN,随着Git工具的逐渐成熟和强大,很多公司就开始转移使用Git了。。。
本文分享一篇“实操 Svn 迁移到 Git”,来源:
导出 svn 工程
首先,我们需要git-svn:
$ sudo yum install git-svn
or
$ sodu apt-get install git-svn
原理上,就是使用git svn clone ...命令。如果你只是简单的执行这个命令的话:
$ git svn clone http://rdsvn.company.net/some_mid_path/Branches/main
那么我们只是将主分支及其 log 取到了本地,但是其他的分支并没有。如果要把所有的分支都 checkout 出来的话,需要用到--trunk、--tags、--branches等选项。
需要注意的有三点:
除了
trunk单词是单数之外,其他的选项单词,请注意是复数。前者就是主分支的目录了,而后者表示的则是对应各个分支 / 标签的上层目录。Git-svn 会将该目录下的所有子目录视为一个独立的分支 / 标签进行导出。这几个选项指定的都是
相对路径,相对于你在git svn clone后面紧跟着的路径的位置。所以请不要在这些选项里面指定诸如 “http://” 开头的绝对地址。除了 trunk 之外,其他几个相关选项可以重复指定。如果你的分支 / 标签分别在 svn 目录上的不同文件夹下,可以多次指定。
于是,对应我们的实际情况,git-svn 命令是这样的:
git svn clone http://rdsvn.company.net/some_mid_path/ \ # 注意这里并没有把主分支的路径写完整
--trunk="Branches/main" --tags="Branches"
稍等一会儿,就可以看到整个 svn 的主分支及分支都被导出来了,一颗赛艇!
分支处理
执行git branch -a可以看到相应的分支已经按照我们指定的选项建立起来了。我的实际情况,分支是这样的:
trunk
tags/main_tag_25189
tags/main_tag_28141
tags/main_tag_28576
这几个分支都被视为 Git 的远程分支,你的本地仓库暂时是空的。可以使用git checkout -b ...来将这几个分支拉到本地。
讲道理,svn 上的分支命名和 git 上的分支命名规则未必是一致的,因此这个时候你会想要重新命名分支。我的建议是这么操作:
在这个仓库中,首先把这几个虚拟的远程分支 checkout 到本地保存下来,这样可以保存 change log
向服务器上传主分支,一般分支名就是 master
将复制出来的其他分支,推到 git 服务器上,按照你希望的规则进行命名
上传到 git 服务器
首先要在 git 服务器上创建一个空的工程,比如 “git@rdgit.company.net/some_mid_path/some_group/firmware.git”
然后在本地仓库中执行:
git remote add origin git@rdgit.company.net/some_mid_path/some_group/firmware.git
然后将主分支上传:
git push origin trunk:master
其他的分支也是利用这个语句创建新分支上传。
完成之后,在 git 服务器上就可以看到完整的 change log 以及分支变化情况啦。
关于空目录
其实迁移的时候还需要注意一个问题,那就是 svn 支持空目录的版本控制,但是 git 不支持。
导出 svn 之后,最好对比一下原始的 svn 工程内是否有空目录。如果有,那么你需要手工(或者写脚本)在导出的 git 工程中创建这些目录,并且在目录中建立一个 “.gitkeep” 文件(这是约定俗成的做法),并且将这些文件git add .gitkeep,以加入 git 的版本控制。这样就以迂回的方式通过 git 版本控制了目录。
长按前往图中包含的公众号关注
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!





