SVN:一般项目的流程指南


1 引言

    本文总结了与scm相关流程的常见项目使用流程。

2 检出

现在你需要决定把库中的模块检出到你本地的什么位置。若为主干开发,请检出主干末端到本地工作副本;分支开发,请检出对应分支到本地。

svn标准命令:svn  co  URL                 导出SVN库中的最新版本

例如:

svn标准命令:svn  co URL  @REV-r  PATH   导出SVN库中指定版本,到本地指定路径下

例如:

备注:关键字co告诉svn想要执行检出操作,而URL指定了想要检出的内

容在版本库的位置,最后告诉svn想要把版本库检出到本地的位置。

另外,在scmpf上创建好版本后, 即可直接取出相应的主干/分支/tag, 其URL可以从scmpf上复制, 如下图所示:

 

3新模块

如果不是对已有模块进行升级,则需要添加新模块。请rd到icafe平台发起模块申请流程,具体步骤见(rd简易操作指南);流程结束后,该模块将自动在对应产品线的trunk,branches,tags目录下创建成功。现在我们需要逐个创建文件/目录,并通过svn add将本地已经创建好的文件通过svn导入到版本库的新模块中。

 

4开发

进入刚刚从版本库检出的目录,若你的工作副本中会有大量不同的工作拷贝,要搞清楚工作拷贝是从哪里来的,可执行svninfo命令进行查询:

 

    使用命令:svn info                       显示当前工作副本版本信息

例如:

使用命令:svn  info  –r revision  URL      显示该URL第xx版本的信息

使用命令:svn  info  –r   revision  –R   URL   递归显示该URL下每一个文件及目录的信息

备注:这里的重点是第二行的URL,SVN会告诉你本地工作副本目录的原始来源。

4.1修改

对于文件/目录的创建,新增,删除,重命名(移动)可使用如下svn命令:

4.1.1创建目录

使用命令:svn  mkdir  URL(新增目录--parents  -m “    “ 

例如:

4.1.2新增

    执行svn add后,svn只记住了你想要添加到项目仓库中的文件的名字;并没有实际添加文件或者把改动让团队的其他人也能看见,所以在add之后,你需要commit。

使用命令:svn  add 目录名称     目录下的所有文件一同纳入版本控制  

             svn  ci -m “    ” 

例如:

使用命令:svn  add 文件名称     仅将此文件纳入版本控制

         svn  ci -m “    ”

例如:

4.1.3删除

不同于CVS,SVN支持目录/文件的删除,但是我们规定不能删除模块及模块以上级别的目录。

使用命令:svn  delete  目录名称/文件名称    删除本地目录/文件,下次ci时从库中删除

             svn  ci -m “   ”

例如:

使用命令:svn  delete  URL -m            直接从库中删除文件

例如:

4.1.4重命名(移动)

重命名操作相当于先新增新的文件,再删除原来旧的文件;SVN支持在模块内部对文件名,目录结构进行调整,但是对于模块及以上目录级别:禁止添加新的中文等非英文文件名的文件,在SVN代码库SCM已经对此进行了限制。

使用命令:svn  rename wc(本地原来目录名/文件名) wc(重命名后的目录名/文件名)

 

           svn  ci -m “        ”       将重命名提交到版本库

例如:

4.2提交

提交前请先查看本地工作副本状态,查看改动和差异,确定好你的修改后,就可以将修改提交到版本库中。

    使用命令:svn  ci -m “     ”             指定日志信息ARG

    备注:清楚地输入日志来表明你所修改的内容是一个很好的习惯,这为以后版本回退提供了方便;且SCM在后台对钩子进行了控制,要求必须提交注释,并且超过5个字节。

执行完提交后,svn的全局版本号会加1,如下图所示:

Svn告诉我们,它提交了版本7604。版本号7604是针对整个版本库而言,而不是某个文件;如上图,我们修改了两个文件,但是全局版本号仍然是7604。你可以把svn的全局版本号看做某种全局的标记,并随着版本库一直往上升,记录着每一次提交的改动。

但是,有些时候我们也会遇到提交失败的情况,比如两个人同时开发一个文件,在你提交前,另一个人已经将他的修改提交入库;此时在你提交时,svn会提示“提交失败”,如下图:

此时执行svn up操作,svn会帮你合并他人的改动到你的本地工作副本,更新后,你可以执行svn log -v来查看刚刚是谁进行了哪些操作,并通过svn diff –r head来确认合并其他改动后的内容,可继续提交你的修改入库,如下:

4.3更新

如上面刚刚提到的例子,如果你不是唯一一个在模块上工作的人,在你工作的时候很有可能其他人已经更新过项目仓库了。频繁地更新你的工作副本,不断合并他人的改动是一个好习惯。 

使用命令:svn up   没有指定版本,则将工作副本更新到当前URL的 HEAD 版本

例如:

使用命令:svn  up  -r      更新到-r 选项所指定的版本

例如:

备注:在更新过程中,svn会显示每一个文件的状态以及对应的重要活动。添加到项目仓库中的文件和目录会被添加到工作副本,从项目仓库中移除的文件和目录也会从工作副本中移除。

每更新一项就输出一行信息,使用首字符来报告执行的动作。这些字符的含义是:

    已添加

    已删除                                         

    已更新

    合并冲突

    合并成功

但是,在此要提醒下,习惯于使用工具CVS的各位同学:对于CVS命令(cvs up –dr ***_PD_BL/****_BRANCH)即可切换到相应的tag/分支上;但是对于SVN,执行命令(svn up)只能更新到当前工作副本所在URL的末端,(查看当前工作副本所在URL可使用命令svn info);想要更新到某一tag/分支,可使用命令:svn switch.

4.4创建分支

在分支创建之前,我们先来了解下分支的概念特点

4.4.1 什么是分支

分支是一种特殊的版本形式,即为把整个目录拷贝到一个新的位置。我们可以对项目或模块分出一个并行开发的版本,对这个并行开发的版本进行修改,然后将分支版本的修改合并到主干或其它分支上来。

4.4.2 分支的特点

1,Svn允许你把修改隔离在各自的开发线上,当你改变一个分支中的文件时,这些更改不会出现在开发主干(trunk)和其它分支中。

2,在这之后你可以使用 svn merge 把这些变更从一个分支移动到另一个分支(或主干) ,并行开发示意图如下:

4.4.3 如何创建分支

  在我们平时的开发中,分支是在发起模块三位版本申请的时候提交的,当四位版本创建成功后,scm平台会根据你提供的基线及想要创建的分支名称,已经帮你把分支创建成功。如下图所示:

点击进入三位版本页面,我们由此可以查询到创建分支的基线版本,如下图:

那么,如果平台创建分支的所需要做的具体操作有哪些呢?

1,确定基线

2,创建分支

使用命令:svn cp  基线版本url  分支url  -m “log信息

备注:当分支创建成功了后,你需要切换到分支对其进行开发。

4.5标记tag

tag是为一些文件的拷贝提供了版本库在某个特定时刻的快照。在主干/分支开发完成并编译成功后,我们需要在其末端标记已经申请成功的四位版本号(即tag),然后到平台上进行单元测试,送测,上线。

使用命令:svn  cp .  URLtag -m  ” log信息

备注:1 svn cp对于原来文件和拷贝的历史会跟踪到同一个来源。svn记住了文件的共享历史,跟踪历史的功能也知道这些操作的存在。

 2svn cp还可以复制多个源到一个目的节点,此时该节点必须是目录。

4.6切换

当你目前本地工作副本为主干,此时你想要切换到分支进行开发,或者想要切换到某一tag查看tag的内容,可执行此操作。

使用命令:svn  switch  URL

例如:

 

4.7同步

当分支上的版本上线后,如果主干上没有开发,则需要把分支上的内容同步到主干;同步即覆盖的意思,将某个分支或者tag的内容完全覆盖到另外一个分支或者主干上。实例详见:http://com.test.com/twiki/bin/view/Sqa/FAQ#对于pre-release状态处理

若在同步前,主干在创建分支后没有提交过任何内容,那么只要在入四位版本信息页面,点击 "同步到主干" 按钮即可成功。但是,若主干上提交了修改,那么就会报如下错误:

此时需要你到svn里手动执行同步到主干操作,步骤如下:

4.7.1确定同步的目标位置,将本地更新到目标位置的末端

对于同步到主干操作,我们首先将本地切换到主干末端。

使用命令:Svn sw (主干)url

4.7.2 执行同步操作

切换到主干后,

使用命令:Svn merge (主干)url   tagurl

          Svn ci –m “log信息                

          Svn cp (主干)url  _PD_BL_MAINtagurl   标记同步tag

备注:  执行同步成功后,还需要rd到scmpf四位版本页面点击同步到主干按钮。

4.8合并

    在介绍合并操作之前,我们先来看一下合并的原理时机

4.8.1  合并原理

1,只要两个新版本的修改不冲突,合并的版本就包含两者的修改

ü  在不同位置添加,合并结果两者都被添加

ü  在不同位置删除,合并结果中两者都被删除

ü  在不同位置更改,合并结果将包括两者的改动

2,当两种修改发生冲突,即两者修改了原版本中的同一代码时,合并结果将显示这些冲突

4.8.2  合并时机

当分支版本测试通过或者上线完成后,要及时将此版本合并到其它进行中的分支或主干上。

4.8.3  合并操作步骤

实例详见http://com.test.com/twiki/bin/view/Sqa/FAQ#合并操作步骤

使用命令:svn sw分支url       将本地开发环境切换到开发分支上

         svn merge  本版本基线版本url   上线tag的url     将上线tag的url内容合并

         svn    ci  -m “log信息”

         svn cp . (合并tag)的url   -m “log信息”        合并完成后,打合并tag                          

备注:

1,若合并不成功,需要还原,在还原了合并完成的文件后,还需要还原.svn目录,执行命令svn revert . –R

2,基线的确定:登录scmpf,查看该模块当前的最新基线版本和tag

如下图所示,若想将5.10.14.0版本的内容合并到正在开发中的分支iknow-fwui_5-10-32_BRANCH中,首先需要确定以上两个分支版本的共同基线:

基线的确定方法,可在scmpf中完成,分别点击进入5.10.14和5.10.12的三位版本页面,查询到以上两个版本的共同基线为:5.10.11.0,那么在执行merge的第一个URL就选为5.10.11.0的URL。

 

3,合并完成后,一定要标记合并tag,然后还需要到scmpf上标记本次合并

4.9查看

    在修改提交之前,我们可以使用svn st 和svn diff两个命令来查看本地工作副本当前修改状态和具体改动内容。svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。

4.9.1查看状态

    在代码修改完成,提交之前,执行svn st 来查看目录下的文件和子目录的状态,正常状态时不显示。输出的前七列各占一个字符宽度,其中第一列最为常用,表示一个项目是增加、删除,还是修改,输出结果常出现的几种状态:

      “ ” 无修改

      “A” 增加

      “C” 冲突

      “D” 删除

      “I” 忽略

      “M” 改变

      “R” 替换

      “X” 未纳入版本控制的目录,被外部引用的目录所创建

      “?” 未纳入版本控制

      “!” 该项目已遗失(被非 svn 命令删除)或不完整

      “~” 版本控制下的项目与其它类型的项目重名

 

使用命令:svn st

例如:

使用命令:svn st –v 

例如:

备注:其中第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。

4.9.2查看改动(比较差异)

若是在提交前忘记了文件为什么被修改,可以使用svn diff命令来查看文件在版本库中的版本和本地工作副本的直接区别。

1,提交前,查看当前工作副本与base版本的差异

使用命令:svn  diff

例如:

备注:第一行告诉正在检查的文件的名字;

两行等号之后的两行告诉我们版本库文件的名字和版本号;

@@-1 +1,2 @@:它告诉我们修改过的地方在文件的哪个位置;

以+开头的行表示他们是新添加的行;

以-开头的行表示这些行被移除了。

2,查看当前工作副本与库中最新代码的差异

使用命令:svn  diff  -r head            

3,比较任意两个版本的差异

使用命令:svn  diff  -r reversion1:reversion2          

4,版本库中任意两个tag做对比

使用命令:svn   diff    (tag1)URL    (tag2)URL

4.9.3查看日志

svn log 有几个非常好用的用法:

1,  最常用的,查看显示本地工作副本当前目录下所有文件版本信息

使用命令:svn log

例如:

2,  详细显示所有相关路径的日志信息

使用命令:svn log –v

例如:

3,  查看分支,tag从主干的哪一版本建立

使用命令:svn log--stop-on-copy -v

例如:

备注:从此我们可以查看到,bs_1-0-7_BRANCH分支是基于主干的7574版本开发的。

4,  显示你所关注的指定版本的日志信息

使用命令:svn  log –r 

5              还原

恢复所有对文件和目录的修改,并且解决所有的冲突状态。svn revert不会只是恢复工作拷贝中一个目录/文件的内容,也包括了对属性修改的恢复。最终,你可以使用它来取消所有已经做过的预定操作(例如,文件预定要添加或删除可以“恢复”)。

使用命令:svn  revert  filename              丢弃对一个文件的修改

备注:svn revert需要你提供至少一个目标,如果你没有给svn revert提供了目标,它不会做任何事情,这样是为了保护你不小心失去对工作副本的修改。

本子命令不会访问网络,是本地操作,它能解除任何冲突的状态,但是,它不恢复被删除的目录。恢复被删除的目录,需要使用up命令。

6              解决冲突

有时,合并更新等操作会导致文件冲突/树冲突,svnresolved 命令用于删除工作拷贝文件或目录的“conflicted”状态。这个程序不是语义上的改变冲突标志,它只是删除冲突相关的人造文件,从而重新允许PATH提交;也就是说,它告诉Subversion冲突已经“解决了”。

使用命令:svn resolved filename

7              FAQ

Q1: Can't add anyting in existing tags, or create aninvalid tag?

A:SCM禁止修改分支内容,当你试图对tag进行修改,并提交代码时,会出现如上提示。此时,请执行svn switch命令切换到tag所标记的主干/分支进行开发,提交。

 

附录1 上线异常回滚操作

触发场景:

产品上线后效果回归与预期不符,需要回退重新修改

基本说明

若为分支开发,请先将此版本同步到主干(否则不能申请四位版本号,因为有pre-released版本存在),完成后,将主干版本回退到出问题版本的基线版本(基线版本可通过scm平台的三位版本页面,例如:点击5.10.16按钮,查询到5.0.16.0的基线版本为

版本操作

  我们需要根据基线版本,来确定回滚到主干的版本号(即r***),通过刚刚的查询,我们了解到要回滚的5.10.16.0版本的基线版本是5.10.15.0,在svn里执行

svn co https://svn.test.com/app/search/iknow/tags/fe/iknow-fwui/iknow-fwui_5-10-15-0_PD_BL_MAIN

备注:

        因为5.10.15.0上线后,执行了同步到主干的操作,那么5.10.15.0的内容完全覆盖到主干后,主干的全局版本号为10424,标记tag:iknow-fwui_5-10-15-0_PD_BL_MAIN后,全局版本号加1,变为10425;实际上,对于主干来说,10424与10425的内容一样;

进入到iknow-fwui_5-10-15-0_PD_BL_MAIN这个tag执行命令

svn log --stop-on-copyv   可以查看到基线版本5.10.15.0是从主干上的10424版本创建的tag后并提交版本号会自动加1

那我们就将主干回滚到10424版本,

回滚的命令是:svn merge -r HEAD:10424 URL

  回滚后就可以重新申请模块开发了,注意,申请新的版本时,分支名称要做下相应的修改

 

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值