`
androider
  • 浏览: 744330 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

如何在svn系统中使用git

 
阅读更多

http://www.robinlu.com/blog/archives/194

 

 

如果正在使用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,等对非线性开发有一定了解再来看各种情况。

好了,基本上知道这些就可以干活了。

分享到:
评论

相关推荐

    git和svn学习入门教程

    Git和Subversion(SVN)都是版本控制系统,用于跟踪和管理软件开发中的代码变更。它们在代码管理和协作方面发挥着至关重要的作用。本教程将帮助初学者了解这两者的基础知识,以便选择适合自己的工具。 首先,让我们...

    文中内容为,如何将Android Studio工具中的SVN库改为Git,希望能帮助到各位码农朋友

    在Android Studio中,开发者可能已经习惯了使用Subversion(SVN),但随着Git的普及,越来越多的团队倾向于采用Git作为首选的版本控制工具。这篇内容将详细阐述如何在Android Studio中将已有的SVN库转换为Git库,...

    如何将SVN项目迁移至Git

    将 SVN 项目迁移到 Git 是一个常见的操作,特别是在团队决定从 SVN 转换到 Git 这种更现代化的版本控制系统时。以下是一份详细步骤,涵盖了如何将 SVN 项目迁移到 Git,包括完整的命令行操作。 首先,你需要在 SVN ...

    git-svn使用用法

    在一些项目中,由于历史原因可能仍在使用SVN作为中央版本控制系统,而git-svn可以使得开发者在本地使用Git的强大功能进行版本控制,同时又能与SVN仓库保持同步。使用场景包括但不限于项目需要与使用SVN的团队合作、...

    svn转化为git

    在过去的许多年里,Subversion(SVN)是广泛应用的版本控制系统,但随着时间的发展,Git逐渐崭露头角,因其分布式特性和强大的功能而受到广泛欢迎。本文将详细介绍如何将现有的SVN仓库转换为Git仓库,以便更好地适应...

    SVN迁移到Git

    从SVN迁移到Git之后,项目开发代码继续在SVN提交,如何同步迁移之后继续在SVN提交的代码到Git

    Git-SVN面试题,都是来自工作中的笔记

    撤销操作是Git中非常重要的一项功能,可以帮助开发者在误操作后恢复项目状态。 1. **撤销提交到索引区的文件**: - 使用 `git reset HEAD <file>` 可以将文件从索引区移除,回到工作目录状态。 2. **撤销提交到...

    svn迁移到git保留commit信息,后续还能维护从svn同步代码到git(亲测有效,网上资源整理最终版)

    公司代码要从svn迁移到git,不想笨笨的重新上传一份新代码,于是研究了下svn代码到git的迁移同时还要保留...在保留commit信息的同时,还能继续从svn同步代码到git,这样即使还有人继续在svn上提交代码也没关系啦!

    SVN和Git简单使用文档

    **SVN(Subversion)与Git是两种广泛使用的版本控制系统,它们在软件开发过程中起着至关重要的作用。本文将深入探讨这两个工具的基本概念、安装、配置以及日常使用方法。** ### SVN(Subversion) **1. SVN简介** ...

    SVN迁移到git

    描述了如何从SVN迁移到git,比较简短,精炼,文档中提到的users.txt为svn与git的用户对照

    git和svn的比较

    2. 本地版本库中作改动:使用Git add和Git commit命令将文件添加到版本库。 3. 更新远端服务器A上的版本库:使用Git push命令更新远端服务器A上的版本库。 4. 管理员对代码的维护:使用Git log和Git branch命令查看...

    SVN,HG,GIT命令对照.pdf

    SVN(Subversion)、HG(Mercurial)、GIT是三种广泛使用的版本控制系统,它们各自有不同的设计理念和命令集,尽管它们在执行相同或相似功能时具有一定的相似性,但直接命令对应关系并不严格存在。下面将详细介绍...

    git svn转换工具

    svn+git实现离线提交并且不需要到处所有svn版本,速度超快非一般的感觉,超越git本身的git2svn功能。 使用本工具需要安装基础工具: 首先安装git msysgit:https://code.google.com/p/msysgit/downloads/list msysgit...

    svn2git.zip

    5. 可能还需要处理一些特定的SVN属性或元数据,以确保它们在Git中得到适当的处理。 在实际操作中,用户可能需要根据自己的需求对工具进行配置,比如选择要迁移的特定分支或忽略某些文件。此外,迁移过程中可能还会...

    svn-git插件Jenkins.zip

    在Jenkins中,svn-git插件是一个非常实用的组件,它实现了Subversion(SVN)与Git版本控制系统之间的集成,使得项目可以同时使用两种不同的版本控制工具,从而满足不同团队的需求。本文将深入探讨svn-git插件在...

    svn类型的git工具64位

    具体到描述中提到的"svn版本控制工具",这可能是指像`git-svn`这样的工具,它是一个Git子命令,允许用户在本地使用Git的同时与远程的SVN服务器进行通信。通过`git-svn`,开发者可以将Git的分支管理和本地版本控制...

    Git与SVN比较

    Git与SVN比较Git与SVN比较Git与SVN比较Git与SVN比较Git与SVN比较Git与SVN比较

    IDEA中SVN、Git的配置

    - 或者,可以在系统环境中手动查找并删除SVN相关的配置文件。 5. **检出SVN工程的方式二:** - 使用同样的步骤进行检出,但在检出完成后,根据实际需求选择`Yes`或`No`来决定是否导入项目设置。 6. **检出完成后...

Global site tag (gtag.js) - Google Analytics