要迁移svn到git ,遇到了很多问题,所幸后来一一解决了。
没有使用迁移工具subgit,而是按照官网的步骤来做的。
一. 调用git svn clone 时卡在初始化空的git库。
Initialized empty Git repository in xxx/.git/
原因:
svn 库版本太高,我使用的是visual svn server 最新版本。
解决方案:
我是通过创建一个ubuntu 虚拟机,在里面搭建新的svn服务器解决的。也可以通过其它方式搭建低版本subversion解决。
二. 不规范分支
svn库中存在一些不标准的分支,这些分支的形式各种各样,总之不是 /branches/xx 的形式,有如 2018/xx/分支名 的不从 branches 开始的分支,有 /branches/xx/分支名 的多级分支,它们都不能在 git svn clone 时被正确识别。
解决方案:
这个问题有3种解决方案,都要通过dump文件解决。
如何导出dump 文件不进行描述,
svnadmin dump xx > xx.dump
svnrdump dump svn/remote/url > xx.dump
1. 直接使用dump文件。
直接以文本方式打开dump文件修改 要修改的路径。但这种方式,我总是不成功。而且对大文件操作很慢
2. svn-dump-reloc
在网上找到这个工具,可以很方便的修改路径。 问题是这种方式每次修改都需要先Load 到仓库,而不是直接修改 dump文件。安装也很费劲。
3. sed 命令
可以直接通过sed 命令修改路径,原理应该也 svn-dump-reloc 差不多
# 比如要修改 路径 2018/xx 到 branches/2018_xx
sed -i 's/Node-path: 2019\/xx/Node-path: branches\/2018_xx/g' xx.dump
sed -i 's/Node-copyfrom-path: 2019\/xx/Node-copyfrom-path: branches\/2018_xx/g' xx.dump
注意事项
不要在git 里清理错误的分支和误传的大文件。这可能会导致加载失败。
三. 清理分支和标签时旧标签删除不掉
按照官网的步骤
你还需要一点 post-import(导入后) 清理工作。最起码的,应该清理一下 git svn 创建的那些怪异的索引结构。首先要移动标签,把它们从奇怪的远程分支变成实际的标签,然后把剩下的分支移动到本地。
要把标签变成合适的 Git 标签,运行
$ git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag "$tagname" "tags/$tagname"; git branch -r -d "tags/$tagname"; done
该命令将原本以 tag/ 开头的远程分支的索引变成真正的(轻巧的)标签。
接下来,把 refs/remotes 下面剩下的索引变成本地分支:
$ git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/$branchname"; git branch -r -d "$branchname"; done
按照这个过程来做,可以生成新的分支和标签,但旧的标签和分支删除不掉,新生成的分支也会带一个 origin/
原因
官网的脚本对路径计算时,计算的是 refs/remotes/xx 而真实情况是 refs/remotes/origin/xx,需要对路径进行修正 。
解决方案:
对脚本 进行修改:
#标签
git for -each-ref refs/remotes/origin/tags | cut -d / -f 5- | grep -v @ | while read tagname; do git tag " $tagname " "origin/tags/ $tagname " ; git branch -r -d "origin/tags/ $tagname " ; done #分支
git for -each-ref refs/remotes/origin | cut -d / -f 4- | grep -v @ | while read branchname; do git branch " $branchname " "refs/remotes/origin/ $branchname " ; git branch -r -d "origin/ $branchname " ; done
现在,就可以得到正确清爽的路径了。
四. svn库太大无法上传。
原因:
svn 时代,对文件大小没有太大限制。而git 对路径有根本的限制。虽然可以在服务器修改,但太大也没有意义。
解决方案:
找到大文件,进行修改。
参照官网的办法删除所有分支中的过往。
#查找文件名并删除
git filter-branch -f --tree-filter "find * -type f -name 'xx*' -delete" -- --all
#删除指定路径目录
git filter-branch -f --tree-filter "rm -rf '要删除/文件夹'" -- --all
补充,找不到大文件路径怎么办
参照 https://www.cnblogs.com/langzou/p/9877165.html
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -10
- 打赏
- 分享
- 微信
- 支付宝