如何将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去了试一试

注意本例中通过 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。

原文地址:https://www.cnblogs.com/wzd5230/p/9638117.html

时间: 2024-10-17 03:08:05

如何将SVN仓库转换为Git仓库的相关文章

git仓库命令

Git init 把目录转换为 git仓库 Git add 将文件提交到暂存区 Git commit -m "" 将改动版本提交到分支仓库 Git status 查看仓库文件状态 Git diff  查看上次文件改动内容 Git clone 克隆git仓库 Git push origin master 推送到远程master仓库 Git pull 从仓库更新文件

svn 版本迁移到 git 仓库

1.拉取 svn代码并转成 git 版本 git svn fetch http://svn.qtz.com/svn/qtz_code/java/qtz_sm/project/qtz_sm -Auser.txt user.txt 文件格式如下 xiaolailong = Loissiau<[email protected]> 如果中途报有svn提交者未映射,则 补上 ,再进入git仓库目录,执行 git svn fetch -Auser.txt -Afilename 相当于 --author-f

源代码管理——git(分布式版本控制和集中式版本控制对比,git和SVN对比,git常用指令,搭建GitHub远程仓库,搭建oschina远程仓库 )

一.git简介 什么是git? git是一款开源的分布式版本控制工具 在世界上所有的分布式版本控制工具中,git是最快.最简单.最流行的 git的起源 作者是Linux之父:Linus Benedict Torvalds 当初开发git仅仅是为了辅助Linux内核的开发(管理源代码) git的现状 在国外已经非常普及,国内并未普及(在慢慢普及) 越来越多的开源项目已经转移到git CVS 最早的开源.免费的集中式版本控制工具 自身设计有问题,会造成提交文件不完整,版本库莫名其妙损坏的情况 SVN

Windows Git Bash命令行下创建git仓库并更新到github

大二的时候就听过老师说有一个叫git的版本管理工具,当时只是听老师说说而已,也没有去使用它,因为当时用过svn,就感觉自己没多少东西需要git管理. 最近几天,我经常在开源中国看别人的帖子,看到别人对git和github这个平台评价如此之高,于是我就下载了一个windows版本的git bash, 一开始使用就被它的速度和实用所折服,于是在我的虚拟Centos 7上也装上了git ,现在我主要利用它帮助我管理一些繁琐的小代码,git这样的工具的魅力还需要我慢慢体会. 现在我就记录一下我在Wind

在U盘里建立git仓库(转)

因为需要频繁的在各电脑上切换,例如在实验室电脑和自己的电脑上工作,工作代码又需要在同版本控制之下.要满足这样的需求,可以使用网上免费的Git托管服务器,例如GitHub,但是免费的托管项目,又需要开源.如果有一个可以可以移动的Git服务器,问题就解决了,本文就是一个把Git服务器版本库放到U盘里面的解决方案,当然你要保证你的U盘别丢了. 以windows为例: 1.windows下安装git的管理工具, 安装时选用 git bash和git here .安装好后鼠标右键桌面或者项目文件下 选择“

如何创建一个 Git 仓库

你可以使用一个已存在的目录作为Git仓库 git init Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令. 在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录). 使用方法 使用当前目录作为Git仓库,

Git仓库的使用

Git简介 什么是版本仓库? 能够一直监视代码的改变,并存储这些文件以便将来引用的一种机制(或者说是软件). 记录了哪些开发人员对项目进行了修改.修改该的具体时间.实际修改的代码内容.甚至时恢复特定修改过的文件或整个项目. 使用版本控制工具能够避免:手动备份多个版本.难以恢复以前的正确版本.解决代码冲突困难.代码管理混乱.难以追溯问题代码的修改人及修改时间 - 常见的版本控制工具:CVS.SVN.GIT 什么是Git? 是一款自由开源的分布式版本控制工具,能够敏捷地处理任何或大或小的项目 是Li

centos/debian配置gitlab 7.1x来搭建自建的git仓库.

centos/debian配置gitlab 7.1x来搭建自建的git仓库. 前言:因为公司的某些历史原因, 有大量的代码还在csv/svn上. 新来的项目不得不走这个,同时,github的enterprise 2500$/y/10p的价格对于多变的项目和人员也不合适. 也为了让某些不习惯使用linux的开发使用上git, 就放弃了之前的gitolite server, 进而采用gitlab来搭建. www.gitlab.com 是gitlab的仓库, 以前的历史版本, 需要先配置gitolit

看图说话之已有的代码文件夹加入到git仓库

最近几个同事的硬盘连续损坏,丢失了不少数据,想想自己硬盘上那么多代码如果突然哪一天找不到了,那岂不是哭了. 仅仅简单的备份引发了一系列的折腾,就想在自己家的nas上建一个git服务器,既可以备份又可以实现版本控制. 我使用的是Git for windows + TortoiseGit 首先,在要加入git仓库的代码根目录上点右键,创建本地git库(如果代码很多的话需要等待一段时间,git需要创建索引) 创建成功后会在我们的根目录下出现一个.git文件夹,如果以后想去掉git版本控制的话,直接删掉