svn命令行基本操作
SVN基本操作
检出checkout(co)
svnco${url}
更新update(up)
svnup
提交commit(ci)
svnci-m"修改xxx问题"
查看当前目录最近5次提交记录
svnlog-l5
查看当前工作拷贝信息
svninfo
查看当前未提交的文件status(st)
svnst
这个命令输出每个添加、修改、删除过的目录和文件,前面的C表示冲突,要特别注意。linux下也可以用svnst|grep^C来查看冲突项。
查看当前修改内容
svndiff
撤销当前修改,覆盖为资源库最新版本
svnrevertpath/filename
递归撤销当前目录修改,覆盖为资源库最新版本。注意新加的文件不会被删除,这时也可以删除工作拷贝,重新checkout
svnrevert.--recursive
SVNmerge
自动合并
主干到分支
建立分支以后,一个要做的事情就是定期将主干上的修改合并到分支。先进入分支的工作拷贝,确认分支上所有修改已经提交,然后:
$svnmergehttp://codeserver/calc/trunk
---Mergingr345throughr356into'.':
Ubutton.c
Uinteger.c
---Recordingmergeinfoformergeofr345throughr356into'.':
U.
$
假设t1时刻建立了分支,t2时刻执行上面的命令进行合并,t3时刻再次执行上面的命令进行合并。由于分支是从主干分离出去的,所以第一次合并的时候(t2),svn能知道分支建立以后进行了哪些修改,它会将分支建立以后这段时间主干的修改(t1~t2),应用到当前工作拷贝。
第二次执行上述命令的时候,svn会意识到t1~t2时刻的修改已经合并过了,所以它仅将t2~t3时间段内主干的修改,应用到当前工作拷贝。第二次合并的时候,svn能够做到智能合并,这依赖于svn:mergeinfo属性,请注意上面命令输出的最后一行,表示svn正在将svn:mergeinfo属性记录到当前目录下,所以执行svnmerge目录的时候,最好在工作拷贝的根路径下执行。
svn:mergeinfo的内容大致如下,它记录合并了哪个路径的哪两个版本的差异,可用svnpropgetsvn:mergeinfopath查看,输出类似如下:
/branches/V8822_optimiz_20090722/lottery:8828-9374
/branches/V8865_wap_20090727/lottery:8876-8937
/branches/V8944_P3_20090803/lottery:8992-9400
/branches/V9377_newp3_20090818/lottery:9400-9947
/branches/V9377_wappay_20090818/lottery:9404-9493
分支回主干
在分支上开发完成后,需要将分支合并到主干。进入主干的工作拷贝的根目录,运行
$svnmergehttp://codeserver/calc/branchurl--reintegrate
我们假设上述命令发生在t4时刻,如果上面的命令不带--reintegrate参数,可能会造成冲突,在svn看来,t1时刻建立了分支,然后主干上进行了一些修改,分支上也进行了一些同样的修改(原因是我们在t2、t3时刻曾经将主干的修改合并到分支),所以就冲突了。加上这个参数以后,根据分支目录http://codeserver/calc/branchurl上的svn:mergeinfo信息,svn在进行合并的时候会排除主干迁移到分支的这些修改,仅仅将分支上的修改迁回主干。
假设在t5时刻,需要再次合并分支上的修改,这时可以不带--reintegrate参数,因为在t4时刻执行命令以后,已经将svn:mergeinfo记录在主干。
手工合并
svnmerge可以理解为比较资源库中的两个不同版本(diff),然后将差异应用到当前工作拷贝。实际上,上面描述的自动合并功能是svn1.5以后才有的,在这之前都是通过手工合并的方式工作。同时,在一些比较复杂的场景,手工合并会更加灵活。手工合并的方式为:
$svnmerge-rversion1:version2http://codeserver/calc/branchurl
$svnmerge-cversion1http://codeserver/calc/branchurl
上面的version1和version2是版本号,可以用HEAD来代替当前最新版本。第一条命令将分支上version1到version2的修改合并到当前工作副本,第二条命令将第version1次提交的修改合并到当前工作副本。
特别要注意理解变更集的概念。下面以15选5项目的分支为例,假设svnlog如下(经过简化)。
------------------------------------------------------------------------
r24673|yeli.hl|2012-01-0821:44:33+0800(日,0812012)|1line
开奖时间修改为20:30
------------------------------------------------------------------------
r24644|yeli.hl|2012-01-0611:42:22+0800(五,0612012)|1line
修正参与链接
------------------------------------------------------------------------
r24615|yeli.hl|2012-01-0418:59:30+0800(三,0412012)|1line
mergetrunk24611
------------------------------------------------------------------------
r24601|yeli.hl|2012-01-0415:29:43+0800(三,0412012)|1line
优化追号期数的显示
------------------------------------------------------------------------
r24585|yeli.hl|2012-01-0413:55:42+0800(三,0412012)|1line
修改“我的淘宝”导航条为3.1版本。
------------------------------------------------------------------------
r24506|yeli.hl|2011-12-3015:17:26+0800(五,30122011)|1line
mergetrunk24505
------------------------------------------------------------------------
r24182|yeli.hl|2011-12-1418:01:48+0800(三,14122011)|1line
十五选五中奖号码解析。
------------------------------------------------------------------------
r24050|yeli.hl|2011-12-0515:04:39+0800(一,05122011)|1line
取彩期的时间程序调度。15X5重命名。投注页面静态代码拆分。
------------------------------------------------------------------------
r23950|yeli.hl|2011-11-2816:50:16+0800(一,28112011)|1line
anhui15*5
可以看到,建立分支的那一次提交是r23950,则-r23950:24050和-c24050代表的是同一个变更集,前者表示23950~24050的差异,后者表示24050这次提交的变更,其实它们都是一样的,都是24050这次提交导致的变更。因此,假设我们已经合并了-rA:B,如果B之后又有一系列提交,最新版本是C,我们想把这之后所有的修改并过来,则需要-rB:C,注意第二次包括了B。
假设现在我们想要手动方式把这个分支的变更迁回主干。则命令为(需要排除两次merge主干的修改):
$svnmerge-r23950:24182branch_url
$svnmerge-r24506:24601branch_url
$svnmerge-r24615:HEADbranch_url
如果用-c方式,最后一个命令等效为:
$svnmerge-c24644branch_url
$svnmerge-c24673branch_url
撤销已提交操作(回滚)
merge的另外一个用途是撤销已经提交的代码,具体的做法是反向merge,用下面的命令撤销一次提交,假设url路径上进行了不应该的提交,进入该路径的工作拷贝,执行
$svnmerge-c-Aurl
$svnmerge-rC:Burl
第一个命令撤销版本号是A的提交,注意版本号前面的减号。第二个命令撤销B~C的提交。执行完以后,再commit。当然,实际上svn并不能删除任意一个版本,这些操作仍然都会在历史中,它的作用只是在当前的HEAD中撤销了某次(或某段)提交的内容。
注意事项
1.为了防止造成破坏,可以带上--dry-run参数进行预览,合并的时候如果带上这个参数,工作拷贝将不会被修改,但是你能够看见有哪些代码被修改,哪些有冲突。
2.merge前保证所有代码已经提交,并且已经进行了更新,并检查当前的工作拷贝是正确的。
3.执行merge操作以后,解决完冲突立即提交。这样可以保证本次提交代表了一次纯粹的merge。例如上面的r24506、r24615,在手工merge回主干的时候,需要排除这些提交,如果这些提交包含了其它修改就没有办法区分了。
4.提交的注释中描述清楚当前是从哪个版本merge到哪个版本,有时候手工合并的时候需要参考到。
5.在根目录执行merge操作,避免在子目录和文件中留下mergeinfo信息。
彩票SVN相关操作
创建代码分支
以lottery为例,随便找个目录,执行类似下面的命令
svncphttp://svn.taobao-develop.com/repos/lottery/trunk/lottery\
http://svn.taobao-develop.com/repos/lottery/branches/V${当前主干版本号}_${项目名称}_${date}/lottery\
-m"创建XXX项目分支"--parents
可以到http://svn.taobao-develop.com/repos/lottery/branches/下参考其它的分支命名。
合并主干的最新修改到分支
开发一段时间以后,需要将主干的最新修改合并到项目分支。进入分支工作拷贝的根路径(请注意一定要在根路径进行操作),运行
1.svninfo确认当前工作路径正确:指向分支
2.svnst确认所有代码都已经提交
3.运行命令
4.svnmergehttp://svn.taobao-develop.com/repos/lottery/trunk/lottery
5.人肉解决冲突,可以用svnst查看(*nix下用svnst|grep^C查看)是否有冲突,C开头的文件标识有冲突,解决完以后用svnresolvedpath/filename标记冲突为已解决
6.svnst确认已经没有冲突了
7.提交
合并分支修改到主干
上日常的时候,需要将项目分支修改合并到日常服务器的主干工作拷贝,但是不提交。在主干工作拷贝根路径(请注意一定要在根路径进行操作)下执行以下操作
1.svninfo确认当前工作路径正确:指向主干
2.svnst确认所有代码都已经提交
3.运行命令
4.svnmergehttp://svn.taobao-develop.com/repos/lottery/branches/V${当前主干版本号}_${项目名称}_${date}/lottery--reintegrate
5.人肉解决冲突,可以用svnst查看(*nix下用svnst|grep^C查看)是否有冲突,C开头的文件标识有冲突,解决完以后用svnresolvedpath/filename标记冲突为已解决
6.svnst确认已经没有冲突了
删除代码分支(项目预发后删除代码分支)
随便找个目录,执行下面的命令(lottery和keno没有区别)
svnmvhttp://svn.taobao-develop.com/repos/lottery/branches/V${当前主干版本号}_${项目名称}_${date}/lottery\
http://svn.taobao-develop.com/repos/lottery/branches/backup_branches/V${当前主干版本号}_${项目名称}_${date}/lottery\
-m"删除${项目名称}代码分支"
项目合并
可先从主干拉一个分支,两个项目分别将自己的修改合并到这个分支。上日常的时候再将这个分支合并到主干。
相关推荐
pub_svnserve.conf的 pub_authz.conf的配置文件有非法字符的原因引起,需要查找pub_authz.conf提的非法内容比如多余的空格删除或直接将pub_authz.conf