SVN完美迁移到GIT
Posted 走路自带音响
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SVN完美迁移到GIT相关的知识,希望对你有一定的参考价值。
需求
由于种种不足为外人道也的原因,公司决定把项目从svn迁移到git,要求如下:
迁移所有分支(branches)。
迁移所有标签(tags)。
迁移所有提交记录(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,其他文件夹的文件都会被忽略。
注意:迁移会比较耗时,如果你的项目很大,分支、标签和时间线很多。
经过实际迁移中发现影响迁移速度的外部因素有:
网速。迁移机器和svn机器尽量是内网。
机器性能。迁移机器尽量性能高一点,最好是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。
以上是关于SVN完美迁移到GIT的主要内容,如果未能解决你的问题,请参考以下文章