如何将SVN仓库转换为Git仓库 - 东东爱含韵 - 博客园

按如下步骤操作就可以将SVN仓库完整的转换为Git仓库:

1) 将远程SVN仓库搬到本地(这一步主要是为了提高转换的速度,也可以忽略)

参考这篇文章: 
http://rongjih.blog.163.com/blog/static/335744612010620105546475/

这里假设最终要转换的SVN仓库为file:///tmp/test-svn

2) 使用git svn clone命令开始转换

$ git svn clone http://demo.democmp.com:81/svn/demo_repo  --no-metadata -T trunk -b branches -t tags

    git svn clone 命令会把整个Subversion仓库导入到一个本地的Git仓库中。这相当于针对所提供的 URL 运行了两条命令git svn init加上gitsvn fetch。因Git需要提取每一个版本,每次一个,再逐个提交。对于一个包含成百上千次提交的项目,花掉的时间则可能是几小时甚至数天(如果你的SVN仓库是远程网络访问的,先执行上面第一步的操作还是有点好处的。不过项目通常提交次数都不少,漫长的等待是少不了的啦,慢慢等吧)。

-T trunk -b branches -t tags告诉Git该Subversion仓库遵循了基本的分支和标签命名法则。如果你的主干(trunk,相当于Git里的master分支,代表开发的主线)、分支或者标签以不同的方式命名,则应做出相应改变。由于该法则的常见性,可以使用-s来代替整条命令,它意味着标准布局(s是Standard layout的首字母),也就是前面选项的内容。下面的命令有相同的效果:

$ git svn clone file:///tmp/test-svn -s

实际测试:

输入如下命令

$ git svn clone file:///E:/code\_exer/svn\_repo -s

然后报错:

Can't create session: Unable to connect to a repository at URL 'file:///E:/code_exer/svn_repo': Unable to open repository 'file:///E:/code_exer/svn_repo' at /mingw64/share/perl5/site_perl/Git/SVN.pm line 305.

解决办法:

出现这个错误原因在路径上 file:///E:/code_exer/svn_repo ”,只需把e:/改为e/,如果改了后还会出现问题,把-s去了试一试

linjinyu 的 history 记录 还要去验证一下

 6881  2019-11-14 10:02:33 linjinyu git svn clone https://120.24.83.59/svn/palmnest/branches/avic-order/ordermanger_server/storeroom-parent --no-metadata -T trunk -b branches -t tags
 6882  2019-11-14 10:13:11 linjinyu git svn clone file:///mnt1t/JAVA_HOME/svn2git/storeroom-parent -s
 6883  2019-11-14 10:14:00 linjinyu git svn clone /mnt1t/JAVA_HOME/svn2git/storeroom-parent -s
 6884  2019-11-14 10:14:27 linjinyu git svn clone file:///mnt1t/JAVA_HOME/svn2git/storeroom-parent -s
 6885  2019-11-14 10:15:20 linjinyu git svn clone https://120.24.83.59/svn/palmnest/branches/avic-order/ordermanger_server/storeroom-parent --no-metadata -b branches -t tags

注意本例中通过 git svn 导入的远程引用,Subversion的标签是当作远程分支添加的,而不是真正的Git标签。导入的Subversion仓库仿佛是有一个带有不同分支的tags远程服务器。用“$ git show-ref”就可以看到转换后Git仓库的相关情况,结果类似如下:

$ git show-ref
1cbd4904d9982f386d87f88fce1c24ad7c0f0471 refs/heads/master
aee1ecc26318164f355a883f5d99cff0c852d3c4 refs/remotes/my-calc-branch
03d09b0e2aad427e34a6d50ff147128e76c0e0f5 refs/remotes/tags/2.0.2
50d02cc0adc9da4319eeba0900430ba219b9c376 refs/remotes/tags/release-2.0.1
4caaa711a50c77879a91b8b90380060f672745cb refs/remotes/tags/release-2.0.2
1c4cb508144c513ff1214c3488abe66dcb92916f refs/remotes/tags/release-2.0.2rc1
1cbd4904d9982f386d87f88fce1c24ad7c0f0471 refs/remotes/trunk

而普通的 Git 仓库是类似如下模样:

$ git show-ref
83e38c7a0af325a9722f2fdc56b10188806d83a1 refs/heads/master
3e15e38c198baac84223acfc6224bb8b99ff2281 refs/remotes/gitserver/master
0a30dd3b0c795b80212ae723640d4e5d48cabdff refs/remotes/origin/master
25812380387fdd55f916652be4881c6f11600d6f refs/remotes/origin/testing

这里有两个远程服务器:一个名为gitserver,具有一个master分支;另一个叫origin,具有master和testing两个分支。

3) 获取SVN服务器的最新更新到转换后的Git仓库(这步通常在连续的转换过程中就没必要了)

$ git svn rebase

4) 转换SVN仓库的svn:ignore属性到Git仓库的.gitignore文件

$ git svn create-ignore

    该命令自动建立对应的.gitignore文件,以便下次提交的时候可以包含它。如果在生成.gitignore文件前想先查看一下,运行命令“git svn show-ignore”即可。

5) 转换SVN的标签为Git标签

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

    该命令将原本以 tag/ 开头的远程分支的索引变成真正的(轻巧的)标签。

    这个在Window下试过不行,报”cp: cannot stat `.git/refs/remotes/tags/*': No such file or directory“的错误,可以使用如下两个标准命令处理:

$ git tag tagname tags/tagname     ----用指定的分支创建一个Git标签
$ git branch -r -d tags/tagname    ----删除指定的远程分支

6) 转换SVN的分支为Git分支

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

该命令把refs/remotes下面剩下的索引变成Git本地分支

7) 最后把转换后的本地Git仓库推到公共的Git服务器

$ git remote add origin \[远程Git服务器地址\]
$ git push origin master --tags

    所有的标签和主干现在都应该整齐干净的躺在新的Git服务器里了。如果要将分支也同步到远程Git服务器,将--tags改为--all。


Original url: Access
Created at: 2019-11-14 09:59:34
Category: default
Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论