SVN项目迁移到码云Git
去年中了勒索病毒之后,放弃了自建仓库,把绝大部分代码都放到了淘蝌蚪的SVN进行管理。感谢这个平台,免费且可以创建私有项目,除了网站的速度慢一点之外也没什么问题。最近想添加新项目时发现已经无法登录到用户页了,不过SVN客户端还可以正常连接,淘蝌蚪推荐大家迁移到Git代码进行管理,周围都用码云的多,来进行一次大迁移吧。
创建svn用户-Git用户的对应文件
svnusername=gitusername<mail@mail.com>
淘蝌蚪会在创建仓库的时候生成一条用户名为""
的记录
""=unknow<unknow@unknow.com>
git svn clone
自己管理的项目我都是按照SVN的目录结构来存放,使用git-svn来迁移也就是个-s参数的事了。
git svn clone http://svnRepository --authors-file=user.txt -s
有部分项目是关联的,用了一个仓库来管理。比如前后端的我的目录结构是
trunk
|-server
|-webview
branches
|-server
|-dev
|-webview
|-dev1
|-dev2
tags
|-server
|-v1
|-v2
|-webview
|-v1
|-v2
可以通过指定子目录把项目分出来
git svn clone http://svnRepository --authors-file=user.txt --trunk=/trunk/server --branches=/branches/server --tags=/tags/server
git svn clone http://svnRepository --authors-file=user.txt --trunk=/trunk/webview --branches=/branches/webview --tags=/tags/webview
我见过很多人拿SVN当网盘来使用,不按照目录结构来存放,而且什么东西都往里面扔,仓库的体积越来越大,最终的结果就是一团糟,每次要提交还不如网盘能自动同步。这样的仓库,我选择了放弃…
检查空目录
Git仓库是不允许存在空目录的,从SVN获取的空目录需要在目录内添加.gitkeep文件
find ./repository/ -type d -empty | xargs -I {} cp .gitkeep {}
调整对应的branchs和tags
git-svn生成的仓库中,对应的branchs里面的内容都还是在远程分支里
在.git/refs/将remotes内对应的branch移动到heads中,将remotes内tags的内容移动到refs的tags里面
mv .git/refs/remotes/origin/dev .git/refs/heads/dev
mv .git/refs/remotes/origin/tags/* .git/refs/tags/
合并提交
在码云创建的新仓库不一定是空的,包含了初始的文件和Initial commit记录,如果直接直接push的话会获得错误
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
这时如果直接pull的话,又会提示历史记录冲突
fatal: refusing to merge unrelated histories
需要增加--allow-unrelated-histories
合并一下,之后提交全部branch,提交tag
git remote add origin https://remote.git
git pull origin master --allow-unrelated-histories
git push origin --all
git push -u --tags