工作笔记之-svn 常用技巧及命令总结


                                                                            SVN常用命令集锦

从服务器上下载上传代码
svn co 路径@版本号  :checkout指定的版本号代码到本地   , co 是checkout的缩写形式
svn up -r 版本号   升级(回退)本地代码到指定的svn版本 , up 是update的缩写形式
svn ci 文件路径1/文件名1 文件路径2/文件名2 。。。-m"上传注释"     ,-m“注释也可写在文件路径前面 ,”上传本地文件到svn服务器 (可以一次上传多个文件)
svn ci .  提交当前目录下所以修改的文件
svn 带用户名和密码的操作
svn update/up svn_地址 --username=your_name  --password=your_password
svn commit/ci xxx.java -m"xxx" --username=xxx --password=xxx

代码提交格式样例:
一个文件
svn ci opp/BluetoothOppObexServerSession.java -m "for SMPCQ00007273,BT can't transfer a file"
多个文件空格隔开
svn ci obex/ClientOperation.java obex/ServerSession.java obex/ClientSession.java -m "for SMPCQ00007273,BT can't transfer a file" 

其他常用
svn info 查看svn信息
svn st 查看修改状态      显示:M  路径   M代表modify修改  st 是status的缩写
svn st -q 只显示修改的文件,不显示不在版本控制下的文件,如?标志的文件。
svn diff 显示修改内容
svn diff > patch_name.patch     导出修改修改内容,并保存为patch形式。
svn export svn代码路径  ;下载代码,不带版本控制(即不带 .svn目录),这样占空间小,但是不能和服务器代码进行比对
svn ci !(test.cp) -m"注释"  :表示除了test.c的所有代码都提交
svn up !(test.c) :表示除了test.c的所有代码都更新

导入patch命令:   保证导出patch和要打patch的代码版本号一样,也就是说没有多次修改
在android目录下: patch -p0<patch_name.patch

新增加文件提交步骤:
svn add 目录/文件
svn st
svn ci 目录/文件 -m“注释”

多个文件修改后添加命令:
1.svn add dir_name   新添加目录dir_name
2.svn add *  进入修改目录,将同一目录下的未加入版本库的文件提交到版本库:
3.svn add * –-force  :添加--force参数,可以一次性全部添加多级目录下的多个新文件,忽略所添加的某些子目录已经在包含在版本控制中的错误
4.svn revert --depth infinity *   : 恢复当前目录下的所以本地修改,比如可以恢复之前的add 、delete等操作

分支合并,代码移植等操作
svn megre 命令格式:
merge [-r N:M ...] SOURCE[@REV] [WCPATH]
svn merge  源目录 目标目录   : svn merge  branch/cts trunk   把cts的修改merge 到trunk目录里面

例:merge 把SOURCE对应版本号的改动 复制到 当前工作目录WCPATH ,默认版本号我0:head
进入当前目录
svn merge -r 7575:7587 http://XXXXX/svn/RealTek/branches/XXX/app/apk

如果出现冲突时选项: P  (postpone)   保持冲突,后面再去处理冲突  (可以通过命令形式解决,也可以通过文本方式处理)
svn st 查看状态 ,C 表示有冲突的文件
在文本方式上,点击有冲突的文件,右键-》eit confilt
修改完冲突后,点击冲突文件-》右键-》resolved ,解决冲突

如果出现local add, incoming add upon merge问题,通过如下命令可以解决
svn resolve --accept working -R .
svn revert --depth infinity *


svn版本回退操作:
还原某一个svn版本的修改
进入对应目录:http://xxxxx/svn/trunk/jb/build/tools
1.svn up 升级到最新代码 (不是必要,须看情况)
2. svn merge -r 9836:9835 http://XXXXX/svn/trunk/jb/build/tools   //还原tools目录下svn9836的修改
3. svn st
M       buildinfo.sh
4.svn ci buildinfo.sh -m“revert svn 9836”


回退到某个旧版本(比如说当前HEAD(最新的svn版本号)为6010,而我要恢复到6000版本)
svn update    //更新到最新版本6010
svn merge -r 6010:6000 source_path
svn st
svn ci modify_files_path -m"restore to revision 6000"
merge是比较指定版本的差异,然后把这些差异保存到本地工作空间,而-r后的6010:6000(注意,这个版本的次序很重要。)
是指在svn号6010相对于6000的修改,并把这些修改还原到6000,保存到工作空间。

同理:回滚中间某一段svn的修改:
svn merge -r new_svn_num:old_svn_num source_path


图形界面操作版本回退
想回退到以前的版本,但是呢在合并完和想回滚这段时间里又有人提交了,而我有不想回退这部分代码。
找了一会后,发现有两个选项可以貌似可以帮助我Revert to this revision 和 Revert changes from this revision
但我不清楚这两个的区别,故google了一把,得到以下信息
譬如有个文件,有十个版本,假定版本号是1,2,3,4,5,6,7,8,9,10。
Revert to this revision: 如果是在版本6这里点击“Revert to this revision”,表示7~10的修改全部作废,历史倒退到了版本6那个年代。
Revert changes from this revision:如果是在版本6这里点击“Revert changes from this revision”,表示版本6这个历史事件被抹杀了,只剩下除版本6外的9个历史事件了。
如果是同时选择了6,7,8三个历史时期并点击“Revert changes from this revision”,表示抹杀6~8这仨历史时期。
同理,如果同时选择7~10,然后点击“Revert changes from this revision”,则效果跟在版本6这里点击“Revert to this revision”是一样的

tortoisesvn 右键没有菜单显示问题:
服务器SVN版本和桌面tortoisesvn版本不匹配会造成不显示右键菜单
svn --version 查看svn 版本号

SVN提交问题的一些注意事项
1. 提交方式:svn命令方式,tortoiseSVN菜单方式
2. 提交注意事项:
1). 如果修改为了解决多个问题,最好是单独提交,有利于之后的跟踪对比
2). 合作修改,提交之前,注意更新svn代码,再添加自己的修改,避免提交冲突和覆盖别人的修改,最好在提交后再检查提交记录
 
提交注释要求:
1. add,modify ,delete
2. 解决的问题描述  (重点)
3. 修改人
4. 提交时间(这个可不用,提交界面会显示)
5. 其他信息(比如针对特定项目的修改说明、patch添加等)
6. 独立的应用开发,改动较大的情况、根据特点。

参考格式:
1. “Modify for bugID number :problem description , by name ,for project_name request”
  “Modify for problem description by name”
2. “Add patch from who for which problem by name”
3. “Add function/apk : description by name”

代码修改注释格式
/*modify/add/delete for bugID number :problem description by  name change_time start */
     代码修改部分
/*modify/add/delete for bugID number :problem description by  name change_time end */


常见的一些问题集锦:

问题一:
关于在linux中使用svn add添加并上传文件到svn的时候,*.so *.bin 等文件被忽略的问题:
方法1: 每次添加文件的时候使用如下命令:svn add  --no-ignore  文件夹
方法2:.编辑以下任一文件(linux的svn客户端的配置文件)
/etc/subversion/config   (针对服务器所有用户有效)
~/.subversion/config  或者 home/user_name/.subversion/config(对当前用户有效,会覆盖上面)
“/etc/subversion/config”这个配置,而不是在上面原有的配置基础上增加)
将文件中包含“global-ignores = ”的行,取消注释,并把这个“=”之后的字符全部删除。要特别注意 global-ignores 前面不要留空格,紧挨着最前面就可以了,否则svn add的时候会出现以下错误:
svn: /etc/subversion/config:103: Option expected    。
保存config这个文件(保存文件之后,SVN就立即载入这个配置,然后立即就可以使用了),即可一劳永逸。永远都不会有漏传的文件了。
参考:http://www.2cto.com/os/201303/193668.html

问题二:
代码比对工具beyond compare 忽略带.svn目录的方法:
Go to the [Session] menu ->[Session Settings]-> [Name Filters]. From here, you can enter in something generic, like ".svn" into the Exclude folders list.
Side Note on Right Click Excludes: a .\ in front of an item makes the path relative to the base folders.
".svn" will hide all .svn folders anywhere
".\.svn" will only hide .svn folders in the base (but not subfolders)
".\Folder\.svn" will only hide .svn folders inside the Folder subfolder of the base folder.

问题三:
svn更新失败解决方法 SVN 本地更新时,由于一些操作中断更新,如磁盘空间不够,用户取消。  可能会造成本地文件被锁定的情况。一般出现这种情况的解决方法:
1、可以使用SVN clean up来清除锁定。(第一步先处理)
2、如果不是本目录锁定,系统提示上一层目录锁定,需要到上一层或者根目录中清除。
3.如果在根目录下都无法clean的话,一般采取的方法是另外找一个目录重新CHECKOUT。但有时有时SVN目录下可能有一些自己本地修改的文件,还未提交到SVN服务器,       这时重新CHECKOUT需要注意本地文件的备份,并且不要强制覆盖服务器上其它人修改的内容。
4.如果觉得第3种很麻烦,可以考虑这样的方法。其实SVN加锁会在.SVN(隐藏文件)中生成一个名字叫lock的文件(无后缀),查找所有的,手工删除。然后再尝试更新, 系统可能会提示某个.base文件无法访问。找到它,把相关的文件或其所在的目录删除,重新UPDATE。工作量就小多了。

问题四:
svn 代码状态出现下面问题,及时删除文件夹,使用svn up 也不能重新升级
local unversioned, incoming add upon update
原因:当工作目录修改删除过时更新使用svn更新就容易发生树冲突“Tree Confilict”.会出现类似提示
解决:
$svn resolve --accept working removed_directory
$svn revert removed_directory  或者 svn revert --depth infinity *
$svn st

问题五:
执行svn up命令,出现如下错误:即使删除文件,重新下载也还是不能解决
Skipped 'configs/my_defconfig' -- Node remains in conflict
解决:使用命令 svn remove --force 目录/文件  可以解决
svn remove --force my_defconfig
svn up 更新成功

问题六:
怎样通过命令行获取android系统的svn号相关
logcat.cpp 中如下语句
version_info_len = snprintf(version_info, 64, "Android Revision: %d\n", ANDROID_VERSION) + 1;
system/core/logcat/Android.mk@中
LOCAL_ANDROID_VERSION := $(shell cd $(LOCAL_PATH) ; if [ -d .svn ] ; then svn info | grep Revision | awk '{ printf("%s", $$2) }' ; else git svn info | grep Revision | awk '{ printf("%s", $$2) }' ; fi)
export SVN_VERSION = $(shell cd $(CURDIR)/../.. ; if [ -d .svn ] ; then svn info | grep "Last Changed Rev" | awk '{ printf("%s", $$4) }' ; else git svn info | grep "Last Changed Rev" | awk '{ printf("%s", $$4) }' ; fi)

在android/system/core/logcat/logcat.cpp中增加语句:则可以通过logcat --svn 获取当前版本的svn号
#ifdef ANDROID_VERSION
 if (argc == 2 && 0 == strcmp(argv[1], "--svn")) {
     printf("build project svn version = %d \n",ANDROID_VERSION);
     exit(0);
    } 
#endif

附svn 命令自带帮助信息svn --help  或者 svn command_name --help (例:svn checkout --help)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值