标签: 版本控制

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