【SVN】常见问题解决方法

前言

SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。

常用操作

1.checkout 工程代码

svn co https://192.168.1.1/project/xxx

2.添加目录/文件到版本控制

svn add readme.txt

3.添加目录或文件后,提交到SVN服务器

svn  ci -m   "commit readme.txt"  readme.txt

4.查看当前目录下文件的状态

svn st 

【?:不在svn的控制中; M:内容被修改; C:发生冲突;
A:预定加入到版本库; K:被锁定】

5.更新当前目录或文件

svn up
svn up -r 2008 test.txt     //将test.txt文件更新到2008版本

6.比较两个版本差异

svn diff -r A   #比较当前工作目录(working copy)与版本A的差异
svn diff -r A:B  #比较历史版本A和B的差异

常见问题及解决方法:

1.文件冲突后删除本地的文件夹后,再次执行svn up无法将svn的文件夹下载到本地?
解决方法:svn revert -R *

2.svn co --depth

–depth empty:只包含目录自身,不包含目录下的任何文件和子目录。
–depth files:包含目录和目录下的文件,不包含子目录。
–depth immediates: 包含目录和目录下的文件及子目录。但不对子目录递归。
–depth infinity: 这是默认的,包含整个目录树。

例如,版本目录如下:

-trunk
-branches
	-b1
	-b2
	-b3
-tags

本地希望签出trunk和b2,不关心b1和b3,那么可以这样操作:

a) 使用–depth immediates签出根目录,这样会得到trunk,branches,tags三个空目录
b) 使用–depth infinity签出trunk,这样会得到trunk整个目录树
c) 使用–depth immediates签出branches,这样会得到b1,b2,b3空目录
d) 使用–depth infinity签出b2,这样会得到b2整个目录树。

当执行svn update /的时候,不会把不关心的b1,b3签出的,因为depth已经"记忆"在工作目录上了。

当其他人向版本库里提交了branches/bx后,可以使用–depth immediates签出branches,这样工作目录会增加bx空目录,而不会影响b1,b2,b3…。
再使用–depth infinity签出bx,即可。

另外,svn up有个参数–set-depth,可以修改保存在工作目录上的depth。

3.撤销svn add(需保证未提交到svn服务器)

svn revert --recursive  addfile

4.通过svn up更新文件时出现如下问题:
Updating ‘.’:
Skipped ‘out_bg0601’ – Node remains in conflict
At revision 641.
Summary of conflicts:
Skipped paths: 1

解决办法:

svn revert out_bg0601    #重新拉取代码

选择r 
已恢复“out_bg0601"

svn up

如果还未更新到最新
svn revert --depth = infinity out_bg0601

5.local dir edit, incoming dir delete upon update

Tree conflict on ‘xxxxx’
local dir edit, incoming dir delete upon update
Select: ( r) mark resolved, ( p) postpone, (q) quit resolution, (h) help:

解决办法:

svn revert  xxxxx(file)   -R 

6.合并文件冲突
在实际项目中,当不同的人修改更新同一份文件时,若修改的部分无重叠部分,svn会自动将修改的部分进行合并,如果有重叠的部分,便会出现如下冲突。
举例:
你本地对main.c进行了修改,同时别人也在修改这个main.c文件并先于你将修改后的文件上传到了svn服务器,此时如果你再通过commit上传该文件会出现下面的错误:

root@letuknowit:/home/kris/calc/trunk# svn ci -m "add some test code" main.c
Sending        trunk/main.c
svn: Commit failed (details follow):
svn: File '/trunk/main.c' is out of date

此时通过svn st查看该文件的状态,* 表示本地副本文件已经过期

root@letuknowit:/home/kris/calc/trunk# svn st
M       main.c
root@letuknowit:/home/kris/calc/trunk# svn st -u
M       *        6   main.c
Status against revision:      7

此时你可能会通过svn up去更新该文件,不好意思,又报错了!o(≧口≦)o

root@letuknowit:/home/kris/calc/trunk# svn up
Conflict discovered in 'main.c'.
Select: (p) postpone, (df) diff-full, (e) edit,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options:

先看下各个选项的含义:

( p) postpone 暂时推后处理,我可能要和那个和我冲突的家伙商量一番
(df) diff-full 把所有的修改列出来,比比看
(e) edit 直接编辑冲突的文件
(mc) mine-conflict 如果你很有自信可以只用你的修改,把别人的修改干掉
(tc) theirs-conflict 底气不足,还是用别人修改的吧
(s) show all options 显示其他可用的命令

这里我们先选择p稍候处理,系统会给出如下输出,main.c前面的C标识说明这是一个冲突中的文件,需要手工处理以解决冲突。

(s) show all options:p
C    main.c
Updated to revision 7.
Summary of conflicts:
  Text conflicts: 1

此时在该文件路径会多出几个文件

root@letuknowit:/home/kris/calc/trunk# ls -al m*
-rw-r--r-- 1 root root 312 2012-09-20 16:35 main.c
-rw-r--r-- 1 root root 216 2012-09-20 16:35 main.c.mine
-rw-r--r-- 1 root root 156 2012-09-20 16:35 main.c.r6
-rw-r--r-- 1 root root 218 2012-09-20 16:35 main.c.r7

其中main.c.mine是融合了你的修改的版本,里面是你更新的内容,main.c.r6是你做更新操作以前的版本,你是在这个版本的基础上做的修 改,main.c.r7是版本库中的最新版本,这里有别人的修改,而就是这个修改和你的修改冲突了。

而此时main.c也发生了变化,会标记出当前的冲突的地方。

root@letuknowit:/home/kris/calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        printf("5 + 10 = %d.\n",add(5,10));
        printf("15 - 10 = %d.\n",sub(15,10));
<<<<<<< .mine
        //kris's test
        printf("kris: 12 + 28 = %d.\n",add(12,28));
=======
        //sally's test
        printf("sally: 60 - 33 = %d.\n",sub(60,33));
>>>>>>> .r7
        return 0;
}

在确定好如何修改该部分代码后(假如上面两部分都要保留,那么就需要将文件中的冲突标记手动删除),需要通过svn resolved命令解决该冲突,此时可以看到刚才的几个临时文件被删除了

root@letuknowit:/home/kris/calc/trunk# svn resolved main.c
Resolved conflicted state of 'main.c'
root@letuknowit:/home/kris/calc/trunk# ls -al m*
-rw-r--r-- 1 root root 278 2012-09-20 17:07 main.c

此时便可以重新提交代码了

root@letuknowit:/home/kris/calc/trunk# svn ci -m "kris add some test code"
Sending        trunk/main.c
Transmitting file data .
Committed revision 8.

7.通过svn st发现某个文件的状态为D状态,即删除状态,但是通过svn up又无法更新下来

解决办法:

svn revert  文件名
然后再通过svn up更新

参考文献:
博客园 https://www.cnblogs.com/sos-blue/p/3422742.html,七月逆流

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值