SVN完美迁移到GIT

Posted 走路自带音响

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SVN完美迁移到GIT相关的知识,希望对你有一定的参考价值。

需求

由于种种不足为外人道也的原因,公司决定把项目从svn迁移到git,要求如下:

  1. 迁移所有分支(branches)。

  2. 迁移所有标签(tags)。

  3. 迁移所有提交记录(commits)。

迁移工具

注意:Linux系统默认没有安装git-svn,需要我们额外install git-svn。
如Mac:brew install git-svn

git-svn文档:https://git-scm.com/docs/git-svn

标准svn目录

svn默认标准目录结构如下(假设项目只有一个README.md文件):

├── branches
│ ├── dev
│ │ └── README.md
│ └── test
│ └── README.md
├── tags
│ ├── proj-v1
│ │ └── README.md
│ ├── proj-v2
│ │ └── README.md
│ └── proj-v3
│ └── README.md
└── trunk
└── README.md
  • trunk:生产代码,类似于git的master分支。

  • branches:用于存放所有的分支,比如上面的dev分支和test分支。

  • tags:用于存放所有的标签。

如果不是标准目录也不要慌,但凡你所遇到的合理问题都有现成的解决方案。

开始迁移

假设你的svn是标准目录结构,迁移命令如下:

git svn clone --username=kyg http://192.168.0.100/svn/proj --no-metadata -s

解释一下:

  • git svn clone:把svn迁移到git。

  • –username=kyg:指定svn项目的登录名。

  • –no-metadata:不迁移元数据(提升迁移速度)。

  • -s:是–stdlayout的简写。会把svn项目的/branches、/tags和trunk迁移到git,其他文件夹的文件都会被忽略。

注意:迁移会比较耗时,如果你的项目很大,分支、标签和时间线很多。

经过实际迁移中发现影响迁移速度的外部因素有:

  1. 网速。迁移机器和svn机器尽量是内网。

  2. 机器性能。迁移机器尽量性能高一点,最好是linux机器(迁移时间会差很多很多很多)。
    git结构调整

不知道是我使用git-svn的姿势不对,还是其他原因,clone完成之后git结构并不是我们期望分支、标签。需要额外的调整。

标签调整

cp -rf .git/refs/remotes/origin/tags .git/refs/tags
rm -rf .git/refs/remotes/origin/tags

分支调整

cp -rf .git/refs/remotes/* .git/refs/heads
rm -rf .git/refs/remotes/

推送到git服务器

git remote add origin http://1192.168.0.110/root/proj.git
git push -u origin --all
git push -u origin --tags

注意:要有git仓库的master权限。

非标准svn目录

例1

假设svn目录如下:branch少个es、tag少个s、trunk里多个一层目录proj。

├── branch
│ ├── dev
│ │ └── README.md
│ └── test
│ └── README.md
├── tag
│ ├── proj-v1
│ │ └── README.md
│ ├── proj-v2
│ │ └── README.md
│ └── proj-v3
│ └── README.md
└── trunk
└── proj
└── README.md

则相应的迁移命令如下:

git svn clone --username=kyg http://192.168.0.100/svn/proj --no-metadata --branches=branch --tags=tag --trunk=trunk

例2

├── dev
│ └── README.md
├── tags
│ ├── proj-v1
│ │ └── README.md
│ ├── proj-v2
│ │ └── README.md
│ └── proj-v3
│ └── README.md
└── trunk
└── README.md

这种目录就稍微恶心了一点,我们不妨先使用svn客户端对/dev目录打个标签放入/branches/dev中,这样就会变成标准目录了,只是多了一个/dev目录,我们不用管它,非标准目录之外的文件和目录都会被忽略。

注意:-s 和 --tags=tag 同时存在时,会使用–tags。

另外,如果不想迁移全部目录,可以用参数–ignore-paths="^doc"进行忽略。
如果不想迁移全部提交记录,可以使用–revision指定起止时间线。

  • 管理远程仓库:git remote add origin http://1192.168.0.110/root/proj.git

  • 查看提交记录:git log

  • 查看当前分支:git branch

  • 查看全部分支:git branch -a

  • 创建分支(从当前分支):git branch dev

  • 切换分支:git checkout dev

  • 删除分支:git checkout

  • 查看标签:git tag

  • 删除标签:git tag -d proj-v1

  • 创建标签:git tag proj-v1

  • 推送全部标签:git push --tags

  • 推送全部分支(并不能把tags也推送上去):git push --all

建议:建议每个项目都添加README.md和.gitignore。