GIT版本控制 — GIT与SVN的相互转换 (三)

标签: git 版本控制
24174人阅读 评论(3) 收藏 举报
分类:

git-svn

 

git-svn用于Git和SVN的转换,可以把Git仓库迁移成SVN仓库,反之亦可。

详细介绍可见[1],或者命令行输入git-svn。

 

Bidirectional operation between a Subversion repository and git.

git svn can track a standard Subversion repository, following the common "trunk/branches/tags" layout,

with the --stdlayout option. It can also follow branches and tags in any layout with the -T/ -t/ -b options.

Once tracking a Subversion repository, the git repository can be updated from Subversion by thefetch

command and Subversion updated from git by the dcommit command.

 

Git迁移到SVN

 

把Git迁移到SVN?没错,还真有这种需求,虽然较少:)

Git has a feature to work with SVN repositories, git-svn, but that's intended to check out

existing code from SVN and work on it, not publishing an existing Git tree into a SVN repository.

 

(1) 依赖包

需要安装subversion-perl、perl-TermReadKey。

Git中带有git-svn,需要确定它的路径可在PATH中找到。

 

(2) 建立svn项目

在svn服务器中新建svn项目proj。

# svnadmin create proj

 

(3) svn项目的本地初次提交

# svn mkdir http://IP:PORT/svn/proj/trunk \

                     http://IP:PORT/svn/proj/branches \

                     http://IP:POPT/svn/proj/tags \

                     http://IP:PORT/svn/proj/docs -m "Initial import"

 

(4) 提交Git proj项目到SVN proj

进入Git proj项目。

# git-svn init -s http://IP:PORT/svn/proj // -s表示svn为标准布局

    标准布局的意思就是:

    trunk分支为:proj/trunk,可以用-T另外指定

    branches分支为:proj/branches,可用-b另外指定

    tags分支为:proj/tags,可用-t另外指定

 

# git-svn fetch // 获取SVN proj的更新

    r1 = 79563196f21ce4699a04fa4ae24d0ca916bf3acf (refs/remotes/trunk)

    trunk分支代表SVN proj的trunk分支

 

# git-svn dcommit // 提交Git proj的更新

    注意!这个时候会报错:

    Unable to determine upstream SVN information from HEAD history.

    Perhaps the repository is empty. at /usr/local/git/libexec/git-core/git-svn line 852.

   

因为现在Git proj的commits不知道要放到SVN proj的哪个版本之后,即Git proj的这些提交要

放在SVN哪个版本之后(显然是放到SVN的初始提交之后,但是Git proj就是不知道,因为设计者

并不考虑把Git proj转为SVN proj的情况:)

 

以下是详细描述:

This fails since the git svn command can't figure out which commits to push: there's no link

between our original Git repository and the Subversion heads.

To fix this, we can use a Git graft to link them. We'll tell Git the commit which created the SVN

folder in which we want to store the project is the parent commit of the first commit in our Git

repository.

 

解决方法

# git show-ref trunk // 显示SVN proj trunk分支的HEAD,即r1

   79563196f21ce4699a04fa4ae24d0ca916bf3acf refs/remotes/trunk

# git log --pretty=oneline master | tail -n 1 // 显示Git proj 的第一个commit

    561c439a15f807b8d62551a0c64f939c15489899 initial import

# echo "561c439a15f807b8d62551a0c64f939c15489899 79563196f21ce4699a04fa4ae24d0ca916bf3acf" >> .git/info/grafts

    把Git proj从561c43开始的提交,添加到SVN proj在795631之后的提交。

# git-svn dcommit // 提交Git proj的更新到SVN proj中

    这个时候就把Git proj完整的转化成SVN proj,后者完全符合SVN的规范了。

 

(5) 把git分支提交到svn的分支

如果原来的git仓库不仅有master,还有其它分支,那么怎么把git的分支提交为svn的分支呢?

这个时候就要用到git rebase了。

 

过程如下:

在远端svn仓库中创建一个新分支。

# svn cp URL/trunk URL/branches/remote-branch

更新本端Git仓库。

# git-svn fetch

切换到本端的分支。

# git checkout local-branch

创建一个用于临时用的分支,其实和local-branch是一样的。

# git checkout -b temp-local-branch

关键点来了,把本端分支的所有修改,合并到远端分支。

# git rebase remotes/remote-branch

完成上一步以后,远端分支已经含有本端分支的所有commit。

接着可以把修改提交到svn仓库了。

# git svn dcommit

最后把本端的临时分支删除。

# git branch -D temp-local-branch

 

此时再查看svn仓库,就会发现branch/remote-branch已经是原来的git分支了。

不过svn分支的日志顺序,相较于原来git分支的可能会有所不同,这是由rebase引起的,正常现象。

 

(6) 从git分支更新svn分支

修改.git/config,添加远程分支:

[svn-remote "branch"]

url = URL/proj/branches/branch

fetch = :refs/remotes/branch

绑定本地分支和远程分支:

[branch "local-branch"]

remote = .

merge = refs/remotes/branch

 

修改了本地分支local-branch后,可以直接提交到远端svn的branch分支了。

# git-svn dcommit

 

SVN迁移到Git

 

相比之前介绍的Git迁移到SVN,SVN迁移到Git才是主流趋势,也更加容易,因为这是git-svn的主要目的。

同样用git-svn来完成迁移:

git-svn primarily can be used to checkout a Subversion repository to a local Git repo and then

push your changes back to the original Subversion repository.

 

克隆SVN仓库,可以使用-T trunk、-b branches、-t tags来指定对应分支,-s表示采用标准布局。

# git-svn clone -s URL/proj proj

相当于执行了git-svn init和git-svn fetch。

 

把SVN仓库的更新同步到Git。

# git-svn rebase

 

创建.gitignore文件。

# git-svn create-ignore

 

将Git的更新提交到SVN仓库。

# git-svn dcommit

 

Author

 

zhangskd @ csdn blog

 

Reference

 

[1]. https://www.kernel.org/pub/software/scm/git/docs/git-svn.html

[2]. http://plpatterns.com/post/234334879/how-to-convert-a-local-branch-in-git-to-a-remote

[3]. http://www.cnblogs.com/kym/archive/2010/08/12/1797937.html

 

查看评论

Git与SVN的相互转换

本文主要介绍SVN与Git的相互转换,SVN与Git的区别,请看文章!
  • itluochen
  • itluochen
  • 2016-09-02 10:21:30
  • 2187

SVN——SVN项目迁移到GIT

svn有很多优点,但是git的出现对svn的冲击的确很大,现在很多公司项目的都迁移的git上了,下面是我自己在做svn迁移项目到git上面时候整理的一些资料。暂时就些整理这些,具体的操作如果有看不懂的...
  • u010648555
  • u010648555
  • 2016-10-16 16:54:51
  • 11900

从svn切换到git上的使用总结

git的基础知识和命令使用总结 一、git的工作区 1.工作目录(workspace):就是我们在开发工具编写代码的地方 2.暂存区(staging) 3.本地仓库(Local repos...
  • txw910
  • txw910
  • 2017-01-08 22:05:58
  • 1412

SVN 迁移到GIT

由于Git分布式体系结构,用户完全可以脱离Git服务端在本地查看,编辑和提交代码,现在公司Leader要求将SVN上面的数据迁移到Git上面,通过git svn命令可以将SVN里面的数据迁移到Git上...
  • huaishu
  • huaishu
  • 2014-11-13 18:11:46
  • 8522

从SVN迁移到Git(包括SVN历史纪录)【最系统的讲解】

SVN to Git:从SVN迁移到Git教程,最全面的讲解git svn clone的各个参数,以及使用file:///协议的本地SVN服务器的迁移命令。...
  • cckit
  • cckit
  • 2015-09-21 14:02:32
  • 1227

idea下git和svn切换问题

使用idea工具进行开发,有时需要使用github  有时又需要svn那如何进行切换它们呢(Idea选择了git就没有了svn,相反也是),解决方法很简单:  修改项目下.idea目录的vcs....
  • u013791374
  • u013791374
  • 2016-10-20 11:10:57
  • 5498

eclipse同时安装了svn和git

今天想将自己的svn项目上传到github去,出现了这么一个问题。 原本按照网上的教程,应该出现: 项目----------->team------------>share projects 但...
  • u010523770
  • u010523770
  • 2016-09-03 18:54:41
  • 3289

Eclipse中使用SVN和Git版本管理工具

本文转载自另外一位博友的文章,主要介绍了在Eclipse或在MyEclipse中安装subclipse插件来使用Svn和Git管理项目版本。...
  • zhang_ling_yun
  • zhang_ling_yun
  • 2017-08-30 21:12:10
  • 835

从 SVN 迁移至 Gitlab + Gitflow 总结

Gitlab Gitflow总结分享转载请注明出处http://blog.csdn.net/uxyheaven/article/details/50373076 之前在的公司一直都是用svn做源代...
  • uxyheaven
  • uxyheaven
  • 2015-12-21 17:00:26
  • 12162
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 154万+
    积分: 1万+
    排名: 1308
    博客专栏
    博客公告

    小程序员一个,坐标深圳。

    Email: zhangskd at gmail.com

    不总在,多包涵

    最新评论