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

补充,找不到大文件路径怎么办

参照 www.cnblogs.com/langzou/p/9… git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -10

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

By yhl

发表回复

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