如何在svn系统中使用git
如果正在使用svn,打算换到git,又暂时不想放弃已有的svn代码库,可以选择git-svn。说一说我自己从svn到git的经验吧。
开始
安装最新版本的git,从git 1.5.3以后支持git-svn,git和svn的配合就要借助这个功能。
安装完毕后要做一些简单的配置。最直接的做法就是创建修改~/.gitconfig。下面是我的.gitconfig
[user]
name = Robin Lu
email = ---@gmail.com
[color]
diff = auto
status = auto
branch = auto
[alias]
st = status
rb = svn rebase
ci = commit -a
co = checkout
[user]部分标示出使用者的身份,你提交的代码会自动引用这一身份信息。[color]设置命令输出的颜色。[alias]部分可以简化一些常用命令,比如在这里将git status简化为git st。
初始化代码库
首先用git-svn来初始化本地的代码库(repository)
git svn clone -s svn-repository-url
svn-repository-url部分使用svn代码库的url。如果要从trunk目录或者某个branch目录里check out,要把-s换成-T、-b等选项。具体参看man git-svn。这个命令时间比较长,因为需要同步所有的提交历史,还好只此一次,以后不会这么慢了。做完这一步,在本地就有了一个完整的代码库,包括所有commit的历史和log,已经可以开始用它来进行开发工作了。
不过,在开始开发之前,最好先做一次垃圾搜集:
git gc
它对代码库的信息进行垃圾搜集和压缩,最明显的作用就是减小磁盘占用空间。第一次做效果尤其明显。
你可以检查一下代码库的状态:
git status
现在应该在一个叫”master”的分支(branch)上。
用这个命令来显示出所有的分支(branch):
git branch -a
master前有一个*号,代表你现在所处的分支,另外还有一个分支叫trunk,它是一个远程分支(remote branch),对应的是远程svn代码库。master实际上是trunk的一个本地分支。
接下来,需要配置忽略文件,让git忽略一些目录中不希望加入代码库的文件,类似svn propset svn:ignore。全局有效的忽略文件列表可以添加在./.git/info/exclude文件中。比如我需要忽略所有vi产生的swp文件:
.*.swp
对于和目录有关的忽略文件设置可以在该目录下创建.gitignore,然后加入需要忽略的内容,比如我希望忽略根目录下的log,tmp等目录,可以直接在根目录下的.gitignore中加入:
log
tmp
开发流程
可以开始工作了。用git后开始养成一个新习惯,就是工作前先创建新分支:
git checkout -b new_branch
-b后是分支名,创建的同时,你要转到了新分支上。尽量保持master上没有未提交到svn的commit,这样随时都可以很容易的产生一个干净的分支。
接下来你可以写代码,修改文件或者添加文件。如果想看看修改了什么,可以用:
git diff
如果对某个修改不满意,希望恢复原状,可以使用:
git checkout path/filename
相当于svn revert
git引入一个索引(index)的概念,提交前,需要把要提交的文件加入到git索引(index)中:
git add path/filename1
git add path/filename2
...
然后提交
git commit -m "提交感言"
每次commit都是提交索引(index)中的内容。
如果要一次提交所有修改过的文件,可以一次性添加,然后提交
git add .
git commit -m "提交感言"
如果只是修改,并没有添加新文件,可以直接用下面的命令:
git commit -a -m "提交感言"
将被修改文件加入索引并提交,一次完成全过程。
在修改加入所索引后,如果想看看索引内容中都所了什么修改,可以用:
git diff --cached
适合在提交前做最后的code review。
查看最近一次提交的内容,可以使用
git show
修改中随时查看当前代码库的状态:
git status
相当于svn status
删除和移动某个文件:
git rm file
git mv file newfile
提交到svn
在完成了几轮工作后,要将本地内容提交到远程svn中,可以先让当前分支和远程svn同步:
git rebase
然后将所有已经合并到master分支的本地修改提交到svn
git svn dcommit
如果在git svn rebase时发生代码冲突,需要先手动解决冲突,然后用git add将修改加入索引,然后继续rebase
git svn rebase --continue
缺点
最后说说这种工作方式的缺点。这个话题稍微复杂一点。
svn和git的工作原理毕竟不同,git对代码提交的非线性特性在svn中难以再现,如果使用了git-merge或者git-pull,再提交到svn,相关分支上的提交历史有可能无法体现在svn上。从svn的使用者的角度,无法辨别这是一个提交还是一次合并,所以在和svn协作过程中,尽量不要使用merge,或者说,尽量让代码库保持线性。
我的经验是,如果不在乎svn中是否反映出提交历史,使用merge也无妨。比如完成工作后,可以将工作分支合并到主分支中去:
git checkout master
git merge new_branch
先用checkout命令切换回master分支,然后将新分支中内容合并进来。然后在master分支上做git svn rebase和dcommit。从svn来看,这就是一个commit,new_branch上的提交历史在svn上体现不出来。(有例外情况,以后再讨论)。
还有一个解决办法是尽量保持git代码库的线性特征。比如在new_branch分支中,先和master做rebase,再合并到master分支中:
git rebase master
git checkout master
git merge new_branch
然后在master上做dcommit,就可以在svn代码库中看到完整的提交历史。
如果看到这已经有点头晕了,可以干脆不管它,就按照前面的做法,直接在你的工作分支里dcommit,等对非线性开发有一定了解再来看各种情况。
好了,基本上知道这些就可以干活了。
如何在svn系统中使用git的更多相关文章
- 如何在 Visual Studio 中使用 Git 同步代码到 CodePlex
开源社区不管在国内还是国外都很火热,微软也曾因为没有开源而倍受指责,但是随着 .Net framework.ASP.Net MVC等框架的逐渐开源,也让大家看到了微软开源的步伐.CodePlex 则是 ...
- 如何在win7系统中安装redis
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/92.html?1455871954 如何在win7系统中安装redis ...
- [转]如何在 Visual Studio 中使用 Git 同步代码到 CodePlex
本文转自:http://www.cnblogs.com/stg609/p/3673782.html 开源社区不管在国内还是国外都很火热,微软也曾因为没有开源而倍受指责,但是随着 .Net framew ...
- 在 Ubuntu 系统中部署 Git Server
http://blog.csdn.NET/poisonchry/article/details/11849781 虽然有很多开源的Git仓库,不过并非所有都尽人意,譬如Github,Gitlab等,不 ...
- 如何在CentOS系统中安装配置SNMP服务
CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,现在有一大部分服务器在使用此操作系统:SNMP(简单网络 ...
- 关于如何在mac系统上安装Git并在码市上建立项目
对Git一窍不通,为了在mac系统上安装Git,查了很多资料,走了很多弯路,一切搞定后发现其实很简单. 1.在https://brew.sh上按要求安装Homebrew. 2.在电脑终端键入brew ...
- 如何在CRM系统中集成ActiveReports最终报表设计器
有时候,将ActiveReports设计器集成到业务系统中,为用户提供一些自定义的数据表,用户不需要了解如何底层的逻辑关系和后台代码,只需要选择几张关联的数据表,我们会根据用户的选择生成可供用户直接使 ...
- 如何在Windows系统中配置Mysql群集(Mysql Cluster)
MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性,增强了安全性,使得单个MySQL服务器故障不会对系统产生巨大的负面效应,系统的稳定性得到保障. Mysql群集(Cluster)简介 M ...
- 手把手教你如何在Ubuntu系统中安装Pycharm
前几天带大家一起安装了Ubuntu14.04系统,没来得及上车的伙伴可以戳这篇文章:手把手教你在VMware虚拟机中安装Ubuntu14.04系统.今天小编带大家一起在Ubuntu14.04中安装Py ...
随机推荐
- SQL PL基本概念
--声明变量 --1.语法: --declare <varible-name> <data-type> <default-constant>默认不变 --decla ...
- 兼容IE浏览器的placeholder【超不错】
jQuery EnPlaceholder plug (兼容IE浏览器的placeholder)使用 >>>>>>>>>>>>&g ...
- Python之路【第十二篇】:JavaScrpt -暂无内容-待更新
Python之路[第十二篇]:JavaScrpt -暂无内容-待更新
- 一次利用MSSQL的SA账户提权获取服务器权限
遇到小人,把服务器整走了 自己手里只有sql server的sa账号密码 模糊记起之前用这个账户提权读取文件的事 百度之,发现相关信息一堆堆 各种工具也用了不少 发现不是语法错误就是权限不够 无奈之下 ...
- Android四大组件之一:ContentProvider(内容提供者)
Android中还提供了名为ContentProvider(内容提供者),可以向其他应用提供数据,但不常用,除非是同一公司开发的App,可以向不同应用提供数据.虽然为Android的四大组件之一,但用 ...
- Missing artifact com.sun:tools:jar:1.5.0
http://java-suddy.iteye.com/blog/1821871(解决了我的问题)
- C# XML文件操作类XmlHelper
类的完整代码: using System;using System.Collections;using System.Xml; namespace Keleyi.Com.XmlDAL{public c ...
- Java设计模式(学习整理)----装饰模式
1.概念: (在我看来,模式就像是是一种思想,在这种思想的指引下,对代码和结构的一番加工和整合而已!都是套路!) 装饰模式又称包装(Wrapper)模式,是以对客户端透明的方式扩展对象的功能,是继承关 ...
- 找出整数中第k大的数
一 问题描述: 找出 m 个整数中第 k(0<k<m+1)大的整数. 二 举例: 假设有 12 个整数:data[1, 4, -1, -4, 9, 8, 0, 3, -8, 11, 2 ...
- Bridge 模式
Bridge 模式将抽象和行为划分开来,各自独立,但能动态的结合.在面向对象设计的基本概念中,对象这个概念实际是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,是一种抽象,一般情况下,行为是 ...