svn 版本库的迁移,只要svn 库为标准目录(trunk、branches、tags)按照git官方文档基本都可以完成。

这里说说我所迁移的非标准目录结构的svn 库

svn 库里有part1目录,part1目录下又分为:code、UI等等,对于这种非标准目录结构,主干就是part1,没有分支,没有标签。

而code下面又分为android、ios目录,目录内才分trunk、tags、branch,这种目录层级结构……


对于以上非标准目录结构,我采用的是先git svn到本地,并提交到git仓库一个完整的版本,然后再将各目录层级进行拆分为独立标准目录结构svn库,然后再将各个库git svn到本地,再提交到git库。

说的可能有些绕,具体来操作下

全局假设:

原svn库地址:file:///home/svn1/

拆分后的标准库地址:file:///home/svn2/$svn/

原svn库对应的git地址:https://git.example.com/dev/oldsvn.git

拆分后对应的git地址:git@git.example.com/dev/$svn.git


注:$svn以具体目录或库名命名

目录结构:

part1:

code:

android:trunk、tags、branches

ios:trunk、tags、branches

UI


将原svn库克隆到本地:

对于标准目录结构含有其它自定义的目录,也可采用此方式,只需将trunk设置为自定义的目录名即可

gitsvnclonefile:///home/svn/\--authors-flie=users.txt--no-metadata--trunk=part1oldsvn

选项含义:

--authors-file: 指定svn和git用户对应关系

--no-metadata: 告诉 git svn 不要包括 Subversion 通常会导入的元数据

--trunk: 主干名

注:这里没有tags和branches所以不加 --tags --branch选项,也不用-s 选项代替。非标准目录结构,实际存在什么就指定什么,不存在不指定。

在clone过程中,可能会有含‘gc‘ 的提示,遇见则‘git gc --prune=now',然后'git svn fetch' 继续clone

成功后,克隆的git 仓库结构对应为:

code:

android:trunk、tags、branches

ios:trunk、tags、branches

UI

将此提交到git 仓库,作为旧版本库,便于查看原svn历史提交修改。

gitremoteaddoriginhttps://git.example.com/dev/oldsvn.git

gitpushorigin--all


对于多层级的目录结构,如现在需要将part1:conde:ios 的库迁移到git 上

首先,将ios 目录拷贝到svn库的根目录,既与part1同级,目录机构如下:

part1:

code:

android:trunk、tags、branches

ios:trunk、tags、branches

UI

android:trunk、tags、branches

ios:trunk、tags、branches

UI:


这样在通过‘git svn clone‘ 的时候,就可以指定trunk为ios了

gitsvnclonefile:///home/svn/\--authors-flie=users.txt--no-metadata--trunk=ios--branch=branches--tags=tagsios


将标签变为合适的 Git 标签

$cp-Rf.git/refs/remotes/origin/tags/*.git/refs/tags/$rm-Rf.git/refs/remotes/origin/tags

这会使原来在 remotes/origin/tags/ 里的远程分支引用变成真正的(轻量)标签。

接下来,将 refs/remotes 下剩余的引用移动为本地分支:

$cp-Rf.git/refs/remotes/*.git/refs/heads/$rm-Rf.git/refs/remotes

将你的新 Git 服务器添加为远程仓库并推送到上面

gitremoteaddorigingit@git.example.com/dev/ios.gitgitbranch-rgitpushorigin--all


在变更svn目录的过程中可能会耗费很多时间,因此也可保持原svn目录结构,进行克隆

gitsvnclonefile:///home/svn/part1/code/android\--authors-flie=users.txt--no-metadata-Ttrunk-ttags-bbranchesandroid

使用此方式,可能会出现未知问题,我遇到的是

fatal:refs/remotes/trunk:notavalidSHA1

以上问题尚未解决