前言
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,七月逆流