常用命令
1、将文件checkout到本地目录
svn checkout path(path是服务器上的目录)
例如:svn checkout svn://192.168.1.1/pro/domain
简写:svn co
下载指定版本
svn checkout svn://192.168.1.1/pro/domain --revision r543
svn checkout svn://192.168.1.1/pro/domain --revision r543
2、往版本库中添加新的文件
svn add file
例如:svn add test.php(添加test.php)
svn add *.php(添加当前目录下所有的php文件)
3、将改动的文件提交到版本库
svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关)
例如:svn commit -m “add test file for my test“ test.php”
简写:svn ci
4、加锁/解锁
svn lock -m “LockMessage“ [--force] PATH
例如:svn lock -m “lock test file“ test.php
svn unlock PATH
5、更新到某个版本
svn update -r m path
例如:
svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最
新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,
修改
文件,然后清除svn resolved,最后再提交commit)
简写:svn up
6、查看文件或者目录状态
1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
2)svn status -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
7、删除 文件
svn delete path -m “delete test fle“
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
8、本地的修改成服务器状态
svn revert xxxx_file
svn revert -R xxx_file_dir
svn revert -R *
通过changelist只提交部分文件
//添加文件
svn cl z_cl -R include/common/file_wrapper.h
svn cl z_cl -R src_code/iot/iot_param.c
//移除文件
svn cl --remove src_code/iot/iot_param.c
svn st
svn ci -m "xxxxx" --cl z_cl
//删除整个changelist
svn changelist --remove --recursive --cl z_cl .
查看log
svn log -l 5 -v
-l 显示版本个数
-v 显示详细修改文件
# -g参数 显示其他分支合并过来的历史记录
svn log -g
-g [--use-merge-history] : 从合并历史使用/显示额外信息
merge合并分支
svn merge -h
merge: Merge changes into a working copy.
usage: 1. merge SOURCE[@REV] [TARGET_WCPATH]
(the 'complete' merge)
2. merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH]
(the 'cherry-pick' merge)
3. merge SOURCE1[@REV1] SOURCE2[@REV2] [TARGET_WCPATH]
(the '2-URL' merge)
例如:将 bra_ipc 分支下的改到merge到ipc主分支下
1. 进入到ipc主分区所在目录
2. svn merge svn://192.168.1.10/home/devs/aaa svn://192.168.1.10/home/devs/bra_aaa
3. 按照提示解决冲突
4. 通过commit提交合并后的代码
说明:这里的svn merge source1 source2是需要在source1的分支下做,将source2改动合并到source1
这条命令和图形界面中的from source1 to source2一样;但是图形界面的from...to...不能理解为从...到...,而是 from为起始状态,to为最终状态,他们之间会做diff比较,之后将to的内容更新到from。
其他参见:
创建分支
利用 merge 创建分支
1. 在本地 branch 创建分支节点
mkdir test_dir
svn add test_dir
svn st
svn commit -m "创建test文件夹" 或者svn commit -m"create test 文件夹名"
2. 进 本地test_dir节点
cd test_dir
#merge主分支内容到当前分支(复制一份主干代码到分支上)
svn merge svn://192.168.1.10/home/devs/branch/xxx/test_dir svn://192.168.1.10/home/devs/trunk/aaa
svn commit -m "创建xxx'ipc"
注意:为了防止开发过程中branch和trunk冲突太多, 所以要经常 merge trunk的内容到branch
合并修改的代码
使用svn merge 合并修改的代码到trunk和上面创建分支的方法是一致的, 只是源和目的地反过来就行
1. 进入本地trunk的节点目录
#更新到本地trunk的代码为最新的
svn up
#merge自己分支的改动内容到本地 trunk;这里我是将 branch/xxx/code节点下的 676版本到677版本的改动 merge到本地 trunk
svn merge -r 676:677 svn://192.168.1.10/smart_home/devs/branch/xxx/code
#可以使用svn st 和 svn diff 来确认修改的内容以及确保已经解决了冲突
svn st
svn diff
#提交改动到 trunk 服务器端
svn commit -m "xxx"
出现冲突
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options:
(e) edit - change merged file in an editor #直接进入编辑
(df) diff-full - show all changes made to merged file #显示更改至目标文件的所有变化
(r) resolved - accept merged version of file
(dc) display-conflict - show all conflicts (ignoring merged version) #显示所有冲突
(mc) mine-conflict - accept my version for all conflicts (same) #冲突以本地为准
(tc) theirs-conflict - accept their version for all conflicts (same) #冲突以服务器为准
(mf) mine-full - accept my version of entire file (even non-conflicts)#完全以本地为准
(tf) theirs-full - accept their version of entire file (same) #完全以服务器为准
(p) postpone - mark the conflict to be resolved later #标记冲突,稍后解决
(l) launch - launch external tool to resolve conflict
(s) show all - show this list
一般选择使用 p 稍后解决冲突
比对文件,查看现在版本和新版本文件之间的不同,如果不相同则修改成最新的文件内容
之后解决完了再用下面语句(如果未解决并直接使用下面该命令会造成,文件状态和服务器的文件还是不一样,会显示该文件已经修改(文件状态为M)从而导致问题还在)
svn resolve --accept working xxxxxx(C状态的的文件)
版本回退
方法1: 用svn merge
1) 先 svn up,保证更新到最新的版本,如20;
2) 然后用 svn log ,查看历史修改,找出要恢复的版本,如10 。如果想要更详细的了解情况,可以使用svn diff -r 10:20 [文件或目录];
3) 回滚到版本号10:svn merge -r 20:10 [文件或目录],注意版本号之间的顺序,这个叫反向合并;
4) 查看当前工作版本中的文件,如test.cpp和版本号10中文件的差别:svn diff -r 10 test.cpp, 有差别则手动改之;
5) 若无差别,则提交:svn ci -m“back to r 10,xxxxx” [文件或目录]。这时svn库中会生成新的版本,如21。
方法2: 用svn up
前2步如方法1,然后直接 svn up -r 10。当前的工作版本就是版本10了。但是注意,这时svn库中并不会生成新的版本,下次svn up之后,还是会回到当前的版本。
===================================================================
例如:改动已经被提交(commit)用svn merge命令来进行回滚。
回滚的操作过程如下:
1、保证我们拿到的是最新代码:
svn update
假设最新版本号是28。
2、然后找出要回滚的确切版本号:
svn log
假设根据svn log日志查出要回滚的版本号是25,此处的something可以是文件、目录或整个项目
如果想要更详细的了解情况,可以使用svn diff -r 28:25 ""
3、回滚到版本号25:
svn merge -r 28:25 ""
为了保险起见,再次确认回滚的结果:
svn diff ""
发现正确无误,提交。
4、提交回滚:
svn commit -m "Revert revision from r28 to r25,because of ..."
提交后版本变成了29。
设置文件属性
设置只读属性
svn propset svn:needs-lock 'x' 需要提交的文件名
设置可执行属性
svn propset svn:executable on test.c
给当前目录下的所有文件设置可执行权限
svn propset svn:executable on *