实际操做 Svn 迁移到 Git

最近把一个开发了好久的项目从公司的 svn 服务器迁移到 GitLab 上,折腾了几天。咱们的 svn 目录结构不是很标准,因此网上的资料没一个可以照搬用的。Anyway,最后成功了,我这里详细记录一下,供参考。html

本文地址:http://www.javashuo.com/article/p-ymryvlxt-ko.htmljava

Reference

SVN 迁移到GIT
svn迁移到Git
SVN迁移到Git的过程(+ 一些技巧)
git-svn 使用环境和步骤
git如何恢复本地删除的文件
git alternatives to “svn info” that can be included in a build for traceability?
svn2git
为git配置扩展命令
SVN、GIT生成版本号
git使用规范
Git 添加空文件夹的方法
转:批量查找空文件夹并放置.gitkeep或.gitignore
git add --all 为啥不能添加空文件夹,这样设计的初衷是?
git 为什么不能添加空文件夹?
Git 里面的 origin 到底表明啥意思?
新手请教:Git 里面的 origin 到底表明啥意思?
git 查看分支 以及所对应的remote
.gitignore 不起做用
git 放弃本地修改更新
git 提交到本地但未push到远端的代码
Git 分支管理和冲突解决
git cherry-pick合并某个commit
Git错误non-fast-forward后的冲突解决
Git下的冲突解决
Git学习笔记05--git stashlinux

看了好多资料……ios

Svn 代码库状况

咱们的 svn 代码库的 URL 固然是机密啦。不过大体原理上,我须要迁移的目录情况以下:git

主分支(在 git 上应成为 master 分支):
http://rdsvn.company.net/some_mid_path/Branches/maingithub

此外打了几个tag:
http://rdsvn.company.net/some_mid_path/Branches/main_tag_25189
http://rdsvn.company.net/some_mid_path/Branches/main_tag_28141
http://rdsvn.company.net/some_mid_path/Branches/main_tag_28576segmentfault

导出 svn 工程

首先,咱们须要git-svn服务器

$ sudo yum install git-svn
or
$ sodu apt-get install git-svn

原理上,就是使用git svn clone ...命令。若是你只是简单的执行这个命令的话:ide

$ git svn clone http://rdsvn.company.net/some_mid_path/Branches/main

那么咱们只是将主分支及其 log 取到了本地,可是其余的分支并无。若是要把全部的分支都 checkout 出来的话,须要用到--trunk--tags--branches等选项。svn

须要注意的有三点:

  1. 除了trunk单词是单数以外,其余的选项单词,请注意是复数。前者就是主分支的目录了,然后者表示的则是对应各个分支 / 标签的上层目录。Git-svn 会将该目录下的全部子目录视为一个独立的分支 / 标签进行导出。
  2. 这几个选项指定的都是相对路径,相对于你在git svn clone后面紧跟着的路径的位置。因此请不要在这些选项里面指定诸如 “http://” 开头的绝对地址。
  3. 除了 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 上的分支命名规则未必是一致的,所以这个时候你会想要从新命名分支。个人建议是这么操做:

  1. 在这个仓库中,首先把这几个虚拟的远程分支 checkout 到本地保存下来,这样能够保存 change log
  2. 向服务器上传主分支,通常分支名就是 master
  3. 将复制出来的其余分支,推到 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 版本控制了目录。

相关文章
相关标签/搜索