Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6267407
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: LINUX

2014-03-31 09:06:50

原文地址:Linux之svn常用命令详解 作者:scq2099yt

1、签出代码
        #svn co path
        
2、添加文件
        #svn add xxx
        将xxx文件或目录添加到svn库中。

3、删除文件
        #svn delete xxx
        将xxx文件或目录从svn库中删除
        这个操作只会删除本地xxx文件,而对于svn库中的xxx文件,需要ci才会真正从svn库中删除。

4、修改文件
        #svn move xxx yyy
        将xxx文件重命名为yyy,类似于Linux的mv命令。

5、检查修改
        #svn status
        检查修改了哪些文件。

6、查看差异
        #svn diff
        列出修改的明细。
        #svn diff -r 3
        同具体的版本进行diff
        #svn diff -r 2:3
        比较具体的两个版本之间的diff

7、查看日志
        #svn log
        查看历史日志信息。

8、撤销修改
        #svn revert xxx
        撤销修改,恢复到未改变的本地工作副本。

9、移除冲突
        #svn resolved xxx
        移除冲突,但并不解决冲突。

10、提交代码
        #svn ci -m "message" xxx
        将xxx文件提交到svn库。

12、更新版本
        #svn update -r xxx path
        将代码更新到xxx版本,如果update后面什么都没有,则将当前目录更新到最新版本。
    
13、分支与合并
        (1)创建分支
        #svn copy trunk branches/xxx -m "message"
        从trunk创建一个分支branch,这样就可以checkout branch分支来开发了。
        需要注意的是:最好将branch与trunk放在同一层级,否则,容易引起混乱。
        (2)分支合到主干
        先用svn st查看branch分支没有任何本地修改,即代码都提交到svn了。
        再checkout一份trunk代码到本地,并切换cd到trunk目录下,执行如下命令来将branch分支上的改动merge到trunk:
        #svn merge
        如果出现merge冲突则进行解决,如下查看冲突文件:
        #svn st|grep ^C
        解决冲突后,执行svn ci提交变动到svn。
        当然也可以merge指定branch上的某些版本合并到trunk:
        #svn merge -r 150:HEAD
        上面命令将branch中从版本150到当前版本的所有改动都合并到trunk中。
        合并完后,可以用如下命令来查看merge情况:
        #svn mergeinfo
        执行上面命令可以查看当前branch中有哪些改动已经合并到trunk中了。
        #svn mergeinfo --show-revs eligible
        执行上面命令可以查看branch中哪些改动还未合并。
        (3)主干合到分支
        主干合并到分支的过程同上,具体如下:
        #svn co
        #svn merge -r 150:160
        #svn st|grep ^C
        #svn ci -m "merge trunk to branch"

        #svn mergeinfo
        #svn mergeinfo --show-revs eligible

14、版本回退
        将代码回退到某一个版本的方法有2种:
        (1)svn merge
        #svn up
        先将本地代码update到最新版本,比如:20。
        #svn log
        查看历史版本,找出要恢复的版本,比如:10(svn版本号在查看的时候会是rxxx,但用的时候要去掉r)。
        #svn diff -r 10:20 代码目录
        如果有必要的话,可以用上面命令来查看待恢复版本与当前版本的差异。
        #svn merge -r 20:10 代码目录
        回滚版本即反向合并,注意上面版本号之间的顺序,上面命令将版本r20回退到r10。
        如果需要从当前最新版本回退到xxx版本,还可以如下:
        #svn merge -r rHEAD:xxx
        上面的地址是待回退分支,操作完成后,本地的working copy会更新为trunk的xxx版本的代码。
        #svn diff -r 10 xxx.cpp
        如果必要可以用如上命令来查看回退后文件差异,如果有则手动修改之。
        #svn ci -m "roll back to r10" 代码目录
        如果没有差异,则需要将代码提交到svn,否则回滚不会生效,提交后会在svn库中生成新的版本号,比如这里会是:r20。
        (2)svn up
        还可以如下来回退版本:
        #svn up 
        #svn up -r 10
        #svn ci -m "roll back to r10" 代码目录

15、创建tags
        #svn mkdir tags
        #svn copy trunk/ tags/project_1.0.0
        执行上面命令将备份版本copy到tags。
        #svn ci -m "add project_1.0.0 to tags"

16、冲突解决
        当你与别人同时开发同一份代码,合并的时候就会出现冲突,比如:svn update,此时svn会提示并让你选择冲突解决方式。
        一般会选择推迟解决即(p) postpone,这样会将冲突引入本地而不会影响svn服务器端,此时,本地目录下会生成几个文件,它们的扩展名分别是xxx.cpp、xxx.cpp.mine、xxx.cpp.r6328和xxx.cpp.r6336。
        可以不用管其它文件,而仅仅修改xxx.txt来解决冲突,在该文件中会有类似于<<<<<<.mine、======、>>>>>>.r6336之类的标记,这些地方就是需要合并冲突的地方,根据需要做增/删/改,保存退出后,开始测试,如果确认没有问题了,就可以如下来告诉svn服务器端你已经解决冲突了:
        #svn resolved xxx.cpp
        该命令会自动删除xxx.cpp.mine、xxx.cpp.r6328、xxx.cpp.r6336这几个文件,需要注意的是,如果手动删除这几个文件也会导致svn服务器认为你已经解决了冲突,这带来的后果是冲突已经存在,而且文件中还存在前面那些奇怪的标记。
        在冲突未解决前,如果试图提交代码会失败,执行完上面命令后,就可以ci代码了。
        关于冲突解决的更详细解决方法请参见这里

17、树冲突
        树冲突:当一名开发人员移动、重命名、删除一个文件或文件夹,而另一名开发人员也对它们进行了移动、重命名、删除或者仅仅是修改时就会发生树冲突。用svn st查看树冲突主要包括如下状态:
        delete:其中目录结构变化
        edit:是指修改文件
        local:是你本地修改
        incoming:是别人修改,你要update或者merge进来。
        这几种状态会组合出如下6种冲突情况:
        1.Local delete, incoming edit upon update(本地删除,更新后传入修改)
        2.Local edit, incoming delete upon update (本地编辑,更新后传入删除)
        3.Local delete, incoming delete upon update (本地删除,更新后传入删除)
        4.Local missing, incoming edit upon merge (本地丢失,合并后传入修改)
        5.Local edit, incoming delete upon merge (本地修改,合并后传入删除)
        6.Local delete, incoming delete upon merge (本地删除,合并后传入删除)
        关于树冲突的详细情况可以参见这里
        在svn命令行merge之后,经常会出现树冲突问题,导致无法提交,可以通过以下命令解决冲突: 
        #svn resolve --accept working -R .  
        .表示冲突路径。

18.外部文件引入
        外部文件引入的常用场景:你的项目依赖外部项目,那么你可以在你的项目下面新建一个文件夹用于外链外部项目,而不用在本地存一份外部项目代码,这样的好处是只要svn up就能保持外部项目的实时更新。
        比如:用tengine开发mod,就可以将tengine的代码放在单独的目录中,外链tengine,自己的mod放在自己的目录下。具体步骤如下:
        #mkdir tengine_source
        #cd tengine_source
        #
svn propedit svn:externals .
        如果提示如下信息:

        svn: None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and no 'editor-cmd' run-time configuration option was found

        说明需要自定vim环境变量,具体如下:
        #vim /etc/bashrc        

        export SVN_EDITOR=vim

        #source /etc/bashrc
        #svn propedit svn:externals .
        在打开的文件中加入外链文件路径和本地目录,具体如下:        

        tengine

        mod_lua

        luajit 

        mod_tmd_2.2.3 mod_tmd_2.2.3

        保存后退出。
        #svn up
        svn update即可看到在tengine_source目录下check out了上面三个目录代码。
        更多关于外部文件引入的详细信息可以参见这里

        
阅读(1602) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~