SVN迁移到Git的过程(+ 一些技巧)

李顺利

Key Words

SVN,Git,Clone,Conversion,Tips,VCS,Pro Git

关于在VCS中SVN和Git之间的迁移(Clone)这个部分网上已经有大批的文章介绍,而且都非常不错,能够满足我们的常见的需求,这里介绍的是我自己整理的一些技巧和使用中出现的一些问题和疑问。

阅读本篇文章,请先有一些Git和SVN的使用经验(又是经验,经验到底是什么?我都不知道)。

第一部分

 

今天的实验对象是,把 http://code.google.com/p/jdbcdslog-exp/ 这个使用SVN管理的project迁移到 Git上面,Git托管网站选择github。SVN迁移到Git,当然要清楚git svn 命令了。

首先请在github上面创建一个repository,这个简单,就不说了,然后就是使用强大的git了。

$ git svn init https://jdbcdslog-exp.googlecode.com/svn/ -s

$ git svn fetch

当然上面的两步,可以作一步处理

$ git svn clone https://jdbcdslog-exp.googlecode.com/svn/ -s

注: -s 参数是表面使用的是svn标准命名方法,即 trunk,tags,branches,这个参数有时很重要,建议使用,命令后面还可以加个文件夹名字作为clone后的目录,如果没有默认是当前路径。

git svn fetch 这个步骤,可能碰到只想从某个版本开始进行fetch,那么请需要 –r 参数。

例如:

$ git svn fetch -r 1342:HEAD

是你想要从这个版本开始fetch,如何查看这个版本号,你可以使用 svn 命令(windows下需要安装Subversion Client,e.g. sliksvn),简单使用就是 svn log svn_url ,这个时候,你可能看到整屏在刷新,没关系,看到log就行。当然更简单的就是使用TortoiseSVN-> Show log。

亦或者你可以这样使用:

$ git svn clone https://jdbcdslog-exp.googlecode.com/svn/ -sr 1342:HEAD jdbcdslog-exp

到这步的时候,本地已经clone了SVN仓库,现在需要的就是提交到远程了。首先,关联github远程仓库,如下:

$ git remote add origin git@github.com:usc/jdbcdslog-exp.git

普通青年这个时候,肯定就会选择使用

$ git push -u origin master

到github上面查看这个仓库(repository),大致效果如下(https://github.com/usc/jdbcdslog-exp

二逼青年当然要看看文档或者仓库信息,有没有什么值得注意的,你瞧瞧,出现了很多branches,并没有tag(SVN仓库目录是标准目录,其中tags下有几个版本的代码,而branches下是没有代码的),是不是很奇怪(上图实际上也说明了一些问题,只有一个branches),既然出现了这样,就要想办法解决了。

问题的解决直接来自《Pro Git》电子书,下面一段copy自《Pro Git》。

【引用开始】

你还需要一点post-import(导入后) 清理工作。最起码的,应该清理一下git svn 创

建的那些怪异的索引结构。首先要移动标签,把它们从奇怪的远程分支变成实际的标签,然

后把剩下的分支移动到本地。

要把标签变成合适的Git 标签,运行

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

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

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

接下来,把refs/remotes 下面剩下的索引变成本地分支:

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

$ rm -Rf .git/refs/remotes

现在所有的旧分支都变成真正的Git 分支,所有的旧标签也变成真正的Git 标签。最后,一项工作就是把新建的Git 服务器添加为远程服务器并且向它推送。为了让所有的分支和标签都得到上传,我们使用这条命令:

$ git push origin –all

所有的分支和标签现在都应该整齐干净的躺在新的Git 服务器里了。

【引用完毕】

上面最后部分(git push origin –all),我运行发现有些问题的,并不能如它所说,分支和标签(branches and tags)都在git服务器中,请看下面截图:

实际上,只提交了branches到github上面,并没有提交tags,当然,很简单,你可以使用 git push –h 查看下帮助,就会发现,你应该知道怎么做了,使用 git push –tags 就可以了。

(使用git push –tags效果)

为了完整,还是说说文艺青年吧。文艺青年还需要搞技术吗?当然是找个上面的普通青年或者二逼青年就搞定了。

第二部分

 

到此,任务已经差不多完成了,之所以说差不多了,是因为在《Pro Git》发现了两个更让人遗忘的技巧。

第一, Log中的信息(主要是作者)

请看完成上面步骤后产生的git log,会是如何

《Pro Git》上面也有说明,需要先把作者信息抓取出来,写到一个文件(假如是user.txt,放在git 当前目录下)中,

git svn clone https://jdbcdslog-exp.googlecode.com/svn/ -sr 1342:HEAD --authors-file=user.txt --no-metadata jdbcdslog

再来看看效果

第二,git ignores

【下面来自《Pro Git》第八章】

假如克隆了一个包含了svn:ignore 属性的Subversion 仓库,就有必要建立对应的.gitignore 文件来防止意外提交一些不应该提交的文件。git svn 有两个有益于改善该问题的命令。第一个是git svn create-ignore,它自动建立对应的.gitignore 文件,以便下次提交的时候可以包含它。

第二个命令是git svn show-ignore,它把需要放进.gitignore 文件中的内容打印到标

准输出,方便我们把输出重定向到项目的黑名单文件:

$ git svn show-ignore > .git/info/exclude

这样一来,避免了.gitignore 对项目的干扰。如果你是一个Subversion 团队里唯一的

Git 用户,而其他队友不喜欢项目包含.gitignore,该方法是你的不二之选。

【引用结束】

第三部分

 

现在代码即在SVN(google code)上面托管着,也在Git(github)上面托管着,当然提交代码的时候,就需要注意点点。代码的提交大致会有两种情况,提交到SVN还是Git。

²  提交到SVN

开发以SVN为主,大部分Members 都使用SVN,那么如果你使用Git管理你的代码,那么如何同步到SVN上面了?很简单,使用下面命令就可以了,

$ git svn rebase

$ git svn dcommit

原则和SVN提交差不多,先更新后提交(个人总结)

²  提交到Git

如果想提交到Git上面,当然先要拉取SVN Repo最新的代码,当你push的时候,你可能就会发现有些问题,

根据提示,你可以很容易就知道如何处理,实际上,这也是git方便的地方,很多时候,提示 + -h 都能搞定问题。好了,整个步骤如下:

$ git svn rebase

$ git pull

$ git commit –am “xxx”

$ git push

第四部分

 

随着Project的开发,可能SVN URL改变了(很多原因,比如域名改变,比如版本升级,再比如一不小心使用了http,想换到https等),那么如果使用SVN,很简单,直接relocate就可以了,但是以前同步使用的Git Project如何跟着变化了,上网查了一下,发现比较有效的来自下面。

https://git.wiki.kernel.org/articles/g/i/t/GitSvnSwitch_8828.html

【引用开始】

General Case

What immediately sprang to mind, and what was suggested e.g. on the mailing list, was to simply edit your .git/config, and change the url= in the section [svn-remote "svn"]. That doesn't work, however. Instead, I found several suggestions to use variations of this theme:

l  Edit the svn-remote url URL in .git/config to point to the new domain name

l  Run git svn fetch - This needs to fetch at least one new revision from svn!

l  Change svn-remote url back to the original url

l  Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)

l  Change svn-remote url back to the new url

l  Run git svn rebase should now work again!

This will only work, if the git svn fetch step actually fetches anything! (Took me a while to discover that... I had to put in a dummy revision to our svn repository to make it happen!)

【引用结束】

注:红色部分请注意下。

本人已经验证这个方法是可以成功切换SVN URL的。

如果想更了解清楚,请参考《Pro Git》第八章——Git 与其他系统。实际上这些内容,全部在《Pro Git》一书中,以前也没仔细阅读,现在发现,它不仅提供了基础知识,而且还想到了我们会出现困难或者疑问的地方,并给出了解决办法或思路。

碰到问题再想着解决,这种“需求驱动学习”的方式是最能让你铭记的。

如果有兴趣的话,后面可以介绍下,在不同的google code project中进行同步(sync)或者备份(SVN迁移到SVN)。

如果你有什么问题和交流,非常欢迎通过Email(lishunli.me@gmail.com) 联系我或者微博@李顺利Me(http://weibo.com/lishunli)。

顺利

2012年1月15日

参考

http://progit.org/book/

http://progit.org/book/zh/

SVN+GIT=鱼与熊掌兼得

git svn实战

如何在svn系统中使用git

小试git-svn

https://git.wiki.kernel.org/articles/g/i/t/GitSvnSwitch_8828.html

博客中的一些下载已经放到了百度云了,请根据需要下载。【点我去百度云下载】

最后弱弱地说一下,如果可以的话,转载请提供出处( http://www.blogjava.net/lishunli/archive/2012/01/15/368562.html),谢谢。

SVN迁移到Git的过程(+ 一些技巧)的更多相关文章

  1. SVN迁移到Git的过程(+ 一些技巧

    关于在VCS中SVN和Git之间的迁移(Clone)这个部分网上已经有大批的文章介绍,而且都非常不错,能够满足我们的常见的需求,这里介绍的是我自己整理的一些技巧和使用中出现的一些问题和疑问.阅读本篇文 ...

  2. git学习------>从SVN迁移到Git之后,项目开发代码继续在SVN提交,如何同步迁移之后继续在SVN提交的代码到Git?

    最近逐步逐步的将公司的项目都从SVN往Git迁移了,但是想团队成员都能够一步到位就迁移到Git是不可能的,因为还有大部分人都还不会Git,所以整个过渡过程估计得大半年. 因此导致虽然项目迁移过来了,但 ...

  3. svn迁移到git仓库并保留commit历史记录

    svn迁移到git仓库并保留commit历史记录 最近在做svn迁移到gitlab,由于之前一直是由svn做版本控制.最简单的方式是将svn的内容export出来,然后添加到gitlab即可.但是,如 ...

  4. svn 迁移至git操作手册

    svn 迁移至git操作手册 项目交付.版本管理工具变更等情况下,迁移svn旧历史记录有很大必要,方便后续追踪文件的提交历史,文件修改记录比对等.git自带了从svn迁移至git的工具命令,可很好的对 ...

  5. 使用subgit进行svn迁移至git(branch,tags)

    前言: 最近公司需要将整体项目从svn迁移至gitlab上,经过几天的研究,现记录一下流程 整体思路是进行一次导入: 先通过subgit将svn整个import至本地,在与git上的项目进行合并. 1 ...

  6. 将代码库从 SVN 迁移至 Git 并保留所有 commit 记录

    公司内部原本使用 SVN 进行版本控制,但随着 Github 的流行我个人的代码管理习惯逐渐转变.虽然公司项目并非开源,SVN 所具有的标准 trunk / branches / tags 结构完全够 ...

  7. svn迁移到git

    步骤命令如下: > git svn clone https://svn-url/ProjectName --no-metadata --authors-file=user.txt --trunk ...

  8. 从svn迁移至Git并保留所有 commit 记录

    用户映射文件user.txt,等号左边为svn账号,右边为Git用户名和邮箱.注意:svn中有多少用户就要映射多少 test1=test1<147258369@qq.com>test2=t ...

  9. svn 迁移到 git 仓库并保留 commit 历史记录

    1.svn 转换为 git(会提示,让你输入先前 svn 的账号与密码) # 切换至 本地项目目录 cd /Users/jianbao/PhpStormProjects/fiisoo/ # 克隆 sv ...

随机推荐

  1. 关于settimeout 和for循环

    for(var i=0;i<3;i++){ setTimeOut(function(){ console.log(i) },500) }; 执行结果:3,3,3 ---------------- ...

  2. ENode框架Conference案例分析系列之 - Quick Start

    前言 前一篇文章介绍了Conference案例的架构设计,本篇文章开始介绍Conference案例的代码实现.由于代码比较多,一开始就全部介绍所有细节,估计很多人接受不了,也理解不了.所以,我先进行一 ...

  3. js 添加广告

    需要调用广告的页面 <script type="text/javascript">    var xzname="巨蟹座";</script& ...

  4. 摩托罗拉SE4500 三星 S3C6410 Wince6.0平台软解码调试记录以及驱动相关问题解释

    虽然S3C6410出来很多年了,甚至于已经停产了,出货的几乎都有依赖于库存,SE4500也出来很多年了,但是网上依旧不会有调试资料帮助你,一切源于自私.希望本文能帮到你,不必感谢.本文来自C.S.D. ...

  5. iOS 开发之 Xcode6 打包生成ipa给测试

    Xcode 6正式版Version 6.0.1 (6A317)已经放出Mac AppStore,之前为了体验swift也安装过beta版,但是并没有注意到6系Xcode对于导出ipa的变化,更新正式版 ...

  6. thinkphp 常见问题

    0.写在最前面的不断更新 (1)trace不起作用 A:必须要输出到模板,才会有trace信息 (2)提示“您浏览的页面暂时发生了错误!请稍后再试-” A:检查控制器(看看能进到控制器没有,设断点输出 ...

  7. 基于visual Studio2013解决C语言竞赛题之0304整除数

      题目 解决代码及点评 按照题目要求,判断数值对3和5取模的结果,是否为0 #include <stdio.h> #include <stdlib.h> void m ...

  8. Framework7初始化

    /** * Framework7初始化 * 需引用jQuery */ /*---------------------------函数---------------------------*/ /** ...

  9. MySQL的GROUP_CONCAT函数

    先根据如下语句生成测试表并填充数据 CREATE TABLE z ( a INT, b INT); INSERT INTO Z SELECT 1,200; INSERT INTO Z SELECT 1 ...

  10. ruby的json请求

    require 'net/http'require 'uri'require 'json' customers = [{    "id" => 1123,    " ...