git-svn:通过git来管理svn代码

简介

svn和git都是常用的版本管理软件,但是git无论在理念或是功能上都比svn更为先进。但是有的公司是以svn作为中央仓库,这时git与svn代码的同步就可以通过 git-svn这个软件进行,从而用git管理svn代码。最后的效果相当于把svn仓库当作git的一个remote(远程仓库),而你本地的代码都是通过git来管理,只有push到svn时才会把你本地的commit同步到svn。

从svn克隆

首先看一看用于测试的svn项目结构,svn的仓库路径是file:///d/Projects/svn_repo,可以用svnadmin create svn_repo命令新建。该仓库有2个分支,1个tag,属于svn标准布局。

SVN项目结构:

12345678910111213
/d/proj1├── branches│   ├── a│   │   └── readme.txt│   └── b│       ├── 11.txt│       └── readme.txt├── tags│   └── v1.0│       ├── 11.txt│       └── readme.txt└── trunk    └── readme.txt

命令格式:git svn clone <svn仓库路径> [本地文件夹名] [其他参数] 相当于git clone
示例: git svn clone file:///d/Projects/svn_repo proj1_git -s --prefix=svn/
参数说明:

  • -s 告诉 Git 该 Subversion 仓库遵循了基本的分支和标签命名法则,也就是标准布局。
    如果你的主干(trunk,相当于非分布式版本控制里的master分支,代表开发的主线),分支(branches)或者标签(tags)以不同的方式命名,则应做出相应改变。
    -s参数其实是-T trunk -b branches -t tags的缩写,这些参数告诉git这些文件夹与git分支、tag、master的对应关系。
  • --prefix=svn/ 给svn的所有remote名称增加了一个前缀svn,这样比较统一,而且可以防止warning: refname ‘xxx‘ is ambiguous.

现在,看下用git-svn克隆的项目情况(运行git branch -a),此处git的分支情况是与svn文件夹对应的。

12345
* master  remotes/svn/a  remotes/svn/b  remotes/svn/tags/v1.0  remotes/svn/trunk

只下载指定版本之后的历史

如果svn上的commit次数非常多, git svn clone 就会非常慢,一般超过几百个版本就要大概十分钟。此时可以在clone的时候只下载部分版本,
命令:git svn clone -r<开始版本号>:<结束版本号> <svn项目地址> [其他参数]
示例:git svn clone -r2:HEAD file:///d/Projects/svn_repo proj1_git -s
说明:其中2为svn版本号,HEAD代表最新版本号,就是只下载svn服务器上版本2到最新的版本的代码.

工作流程

简单来说就是,首次新建分支会记录和svn远程对应分支的追踪关系,之后你的所有commit都是在本地的;并且和纯git管理的项目没有区别,只是在git svn rebasegit svn dcommit的时候才会和svn仓库发生关系

一般工作流程(推荐)

  1. 新建分支git checkout -b <本地分支名称> <远程分支名称>
    示例:git checkout -b a svn/a
    说明:此处新建了一个本地分支a,与svn的a分支对应。
  2. 在本地工作,commit到对应分支上
  3. git svn rebase 从svn上更新代码, 相当于svn的update。
  4. git svn dcommit 提交你的commit到svn远程仓库,建议提交前都先运行下git svn rebase。

在git本地其他分支工作的情况

  1. git chechout -b a svn/a 此处新建了一个本地分支a,与svn的a分支对应。
  2. git checkout -b feature1 在a分支的基础上,开一个本地feture1分支
  3. 在feture1分支进行开发,有了多次commit
  4. 在feture1分支上进行git svn rebase 和 git svn dcommit,这样feature1的commit也会提交到svn的a分支上。
    需要注意的是要记住feture1是从哪个分支checkout的,它的svn远程分支就与哪个相同。比如此处是a分支,那么svn分支就是svn/a,commit就会提交到svn的a分支。

SVN分支管理

新建分支到svn

命令:git svn branch <分支名称>
示例:git svn branch c_by_git
说明:在svn仓库上建了了一个c_by_git分支
分支情况

1234567
  a* master  remotes/svn/a  remotes/svn/b  remotes/svn/c_by_git  remotes/svn/tags/v1.0  remotes/svn/trunk

删除svn分支

  • 删除svn分支目录svn rm <svn分支路径> -m <commit信息>
    示例:svn rm file:///d/Projects/svn_repo/branches/c_by_git -m ‘rm branch‘
  • 删除远程跟踪分支git branch -D -r <远程分支名称>
    示例:git branch -D -r svn/c_by_git

SVN上tag管理

新建tag

命令:git svn tag <tag名称>
示例:git svn tag v1.1
说明:在svn仓库上建了一个v1.1tag

删除tag

  1. 删除svn目录svn rm <svntag路径> -m <commit信息>
    示例:svn rm file:///d/Projects/svn_repo/tags/v1.1 -m ‘rm tag‘
  2. 删除远程跟踪分支git branch -D -r <远程分支名称>
    示例:git branch -D -r svn/tags/v1.1
    说明:svn的tag和分支在git看来是一样的,所以此处还是用的git branch

冲突解决

如果本地和svn都进行了修改,则不能快速前进,git svn rebase 会出现错误。
这时应该按以下步骤操作:

  1. 手动修改冲突文件,修改完成后git add
  2. git rebase --continue
  3. git svn dcommit

svn不遵循规范的情况

以上讲的都是svn仓库是标准的情况,如果不标准,则以下几个地方都会有所不同。主要就是每个步骤基本都要添加svn的具体路径。
先看看,示例项目的结构,仓库路径是file:///d/Projects/svn_repo2。这个项目主分支是dev文件夹,branch1和tag1文件夹分别代表的是一个分支和tag。

svn项目结构:

1234567
/d/proj2├── branch1│   └── file1.txt├── dev│   └── file1.txt└── tag1    └── file1.txt

从svn克隆

命令:git svn clone <svn项目地址,要包含具体分支路径> [本地文件夹名]
示例:git svn clone file:///d/Projects/svn_repo2/dev proj2_svn

添加远程分支信息

命令:

  1. git config --add svn-remote.<远程分支名称>.url <svn地址,要包含具体分支路径>
  2. git config --add svn-remote.<远程分支名称>.fetch :refs/remotes/<远程分支名称>

示例:

  1. git config --add svn-remote.svn/branch1.url file:///d/Projects/svn_repo2/branch1
  2. git config --add svn-remote.svn/branch1.fetch :refs/remotes/svn/branch1

说明:此处的“远程分支名称”可以随意填写,只要这三个保持一致即可。建议都给他们增加svn/前缀,这样svn的所有分支显示起来会比较一致,与上面clone时的--prefix=svn/类似。

新建本地分支,与svn对应

命令:

  1. git svn fetch <远程分支名称> 获取svn仓库该分支的代码
  2. git checkout -b <本地分支名> <远程分支名称>

示例:

  1. git svn fetch svn/branch1
  2. git checkout -b branch1 svn/branch1

分支情况:

1234
* branch1  master  remotes/git-svn  remotes/svn/branch1
时间: 2024-11-01 08:26:07

git-svn:通过git来管理svn代码的相关文章

svn环境快速搭建(svn|http|ldap)+ifSVNAdmin

SVN服务快速部署:下面讲述了3种认证方式:svn.http.ldap1.svn认证#查看系统版本信息cat /etc/redhat-release uname -rm #安装软件并启动yum install subversion -ymkdir -p /application/{svndata,svnpasswd} /usr/bin/svnserve -d -r /application/svndata --pid-file=/application/svndata/svn.pidps -ef

本地如何将svn和git管理的代码做关联

svn和git都是广为流传的代码版本管理工具,实际项目中往往会将两者结合使用,那么如何将本地的一份代码和两者做有机的关联呢! 前提假设:项目已经在开发阶段中,此时变更了svn代码库的地址:或者是组里来的新人,需要你帮忙配置环境,你怎么搞? 我的实践流程如下:(ps:不一定是最优操作和最优方案,问题是可以解决的) 1.在本地workspace目录下,svn co 'svn路径'; 2.进入checkout的项目根目录下,执行git init命令,初始化git(会在根目录下生成.git文件夹); 3

源代码管理工具Svn和Git

一.源代码管理工具诞生的原因: 1.无法后悔:做错了一个操作后,没有后悔药可以吃: 注解:在用Xcode编程的时候,我们做了一个代码修改,忽然Xcode崩了,或者是不小心关掉了.那么刚才所写的好代码就丢失了,即使Command+Z也无法后退 2.版本备份:费空间.费时间: 如果我们为了防止写完一个模块或者一个功能的代码后Xcode因不小心关闭而丢失代码,就去做版本备份,那写完一个项目,岂不是备份了成百上千份?耗时耗空间! 3.版本混乱:因版本备份过多造成混乱,难于找回正确的想要的版本: 备份过多

Git与SVN常用命令与管理工具的使用

Git git init:初始化本目录为一个仓库 git clone [email protected]:ChenNan-FRAM/Fenvo.git : 克隆一个远程仓库 git add:提交到本机版本库,不提交至服务器最新版本库 git commit -a -m "注释":把修改的文件先提交到stage,然后再从stash提交到branch git diff 对比工作区和stage文件的差异 git diff –cached 对比stage和branch之间的差异 git bran

初识SVN与GIT代码上传

最近开始进行多人项目,但是从来没有做过多人项目,所以Google了一下多人项目需要的一些注意事项 首先 第一点:在多人开发项目时候要在自己建立的类,在建立类的时候要在前缀加上自己的标识符用来区分类名,避免冲突 第二点:在书写代码时,两个开发者不要在同一个类中同时写一个类方法内容,这样在合并代码时会导致代码冲突,会引发很多问题 Git:git是一种分散式的代码上传方式,每个人在自己的电脑上都有一个完整的本地仓库,从网络仓库上克隆下来的都是完整的仓库,每个人都能看到整个项目的完整代码,当服务器宕机或

梳理版本控制器:SVN和Git比较

在日常运维工作中,经常会用到版本控制系统,目前用到最广泛的版本控制器就是SVN和Git,那么这两者之间有什么不同之处呢?今天在此详细记录下: SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版本控制器!这是两者之间最核心的区别. Git不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应Git提供的一些概念和特征. 先来说说集中式版本控制系统: 版本库是集中存放在中央服务器的,而干

SVN和git孰优孰劣

SVN 的主要功能 SVN属于集中化的版本控制系统,有个不太精确的比喻:SVN = 版本控制+ 备份服务器 SVN使用起来有点像是档案仓库的感觉,支持并行读写文件,支持代码的版本化管理,功能包括取出.导入.更新.分支.改名.还原.合并等.      功能有许多我就不一一列了,SVN大都采用图形界面操作,直观,上手快. Git的主要功能 Git是一个分布式版本控制系统,操作命令包括:clone,pull,push,branch ,merge ,push,rebase,Git擅长的是程序代码的版本化

GIT使用入门篇(管理自已的代码)

1.Git介绍 Git 是一款免费的.开源的.分布式的版本控制系统.旨在快速高效地处理无论规模大小的任何软件工程. 每一个 Git克隆 都是一个完整的文件库,含有全部历史记录和修订追踪能力,不依赖于网络连接或中心服务器.其最大特色就是“分支”及“合并”操作非常快速.简便. 2.Git和Svn的区别 SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器.集中式版本控

命令行操作svn和git和git

前几天在写代码的时候电脑突然坏掉,老大交代的任务没完成,非常痛恨自己用svn或者git保存代码,相信很多程序员遇到过,硬盘坏掉,存在硬盘中的代码丢失,无法找回的问题,svn和git可谓程序员界的福音,那么问题来了,什么是svn和git呢? svn和git其实都是一种用来管理项目的控制版本工具,他们有很多好处,比如 1.防止代码丢失----可以把自己的代码上传到服务器上 2.适合多人开发----合并代码超级简单 3.能够进行版本回退 4.能解决冲突和bug 5.可以做分支 6.责任到人----可以