迁移svn到git遇到的各种问题及解决

要迁移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

  • 打赏
  • 分享
分享到...
请选择打赏方式
  • 微信
  • 支付宝

By yhl

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注