SVN 基本操作

检出checkout(co)

svn co ${url}

更新update(up)

svn up

提交commit(ci)

svn ci -m 修改xxx 问题"

查看当前目录最近5

svn log -l

查看当前工作拷贝信息

svn info

查看当前未提交的文件status(st)

svn st

这个命令输出每个添加、修改、删除过的目录和文件,前面的C 表示冲突,要特别注意。linux 下也可以用svn st | grep ^C

查看当前修改内容

svn diff

撤销当前修改,覆盖为资源库最新版本

svn revert path/filename

递归撤销当前目录修改,覆盖为资源库最新版本。注意新加的文件不会被删除,这时也可以删除工作拷贝,重新checkout

svn revert . --recursive

SVN merge

自动合并

主干到分支

建立分支以后,一个要做的事情就是定期将主干上的修改合并到分支。先进入分支的工作拷贝,确认分支上所有修改已经提交,然后:

$ svn merge http://codeserver/calc/trunk

--- Merging r345 through r356 into '.

U    button.c

U    integer.c

--- Recording mergeinfo for merge of r345 through r356 into '.

U   .

$

假设t1 时刻建立了分支,t2 时刻执行上面的命令进行合并,t3 时刻再次执行上面的命令进行合并。 由于分支是从主干分离出去的,所以第一次合并的时候(t2 ),svn 能知道分支建立以后进行了哪些修改,它会将分支建立以后这段时间主干的修改(t1 ~t2

第二次执行上述命令的时候,svn 会意识到t1 ~t2 时刻的修改已经合并过了,所以它仅将t2 ~t3 时间段内主干的修改,应用到当前工作拷贝。 第二次合并的时候,svn 能够做到智能合并,这依赖于svn:mergeinfo 属性,请注意上面命令输出的最后一行,表示svn 正在将svn:mergeinfo 属性记录到当前目录下,所以执行svn merge

svn:mergeinfo 的内容大致如下,它记录合并了哪个路径的哪两个版本的差异,可用svn propget svn:mergeinfo path

/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

分支回主干

在分支上开发完成后,需要将分支合并到主干。进入主干的工作拷贝的根目录,运行

$ svn merge http://codeserver/calc/branchurl --reintegrate

我们假设上述命令发生在t4 时刻,如果上面的命令不带--reintegrate 参数,可能会造成冲突,在svn 看来,t1 时刻建立了分支,然后主干上进 行了一些修改,分支上也进行了一些同样的修改(原因是我们在t2 、t3 时刻曾经将主干的修改合并到分支),所以就冲突了。 加上这个参数以后,根据分支目录http://codeserver/calc/branchurl 上的svn:mergeinfo 信息,svn

假设在t5 时刻,需要再次合并分支上的修改,这时可以不带--reintegrate 参数,因为在t4 时刻执行命令以后,已经将svn :mergeinfo

手工合并

svn merge 可以理解为比较资源库中的两个不同版本(diff 实际上,上面描述的自动合并功能是svn1.5

$ svn merge -r

$ svn merge -c

上面的version1 和version2 是版本号,可以用HEAD 来代替当前最新版本。第一条命令将分支上version1 到version2 的修改合并到当前工作副本,第二条命令将第version1

特别要注意理解 变更集 的概念。下面以15 选5 项目的分支为例,假设svn log

------------------------------------------------------------------------

r24673 | yeli.hl | 2012-01-08 21:44:33 +0800 ( 日, 08  1 2012) | 1 line

 

开奖时间修改为20 :30

------------------------------------------------------------------------

r24644 | yeli.hl | 2012-01-06 11:42:22 +0800 ( 五, 06  1 2012) | 1 line

 

修正参与链接

------------------------------------------------------------------------

r24615 | yeli.hl | 2012-01-04 18:59:30 +0800 ( 三, 04  1 2012) | 1 line

 

merge trunk 24611

------------------------------------------------------------------------

r24601 | yeli.hl | 2012-01-04 15:29:43 +0800 ( 三, 04  1 2012) | 1 line

 

优化追号期数的显示

------------------------------------------------------------------------

r24585 | yeli.hl | 2012-01-04 13:55:42 +0800 ( 三, 04  1 2012) | 1 line

 

修改“ 我的淘宝” 导航条为3.1

------------------------------------------------------------------------

r24506 | yeli.hl | 2011-12-30 15:17:26 +0800 ( 五, 30 12 2011) | 1 line

 

merge trunk 24505

------------------------------------------------------------------------

r24182 | yeli.hl | 2011-12-14 18:01:48 +0800 ( 三, 14 12 2011) | 1 line

 

十五选五中奖号码解析。

------------------------------------------------------------------------

r24050 | yeli.hl | 2011-12-05 15:04:39 +0800 ( 一, 05 12 2011) | 1 line

 

取彩期的时间程序调度。15X5

------------------------------------------------------------------------

r23950 | yeli.hl | 2011-11-28 16:50:16 +0800 ( 一, 28 11 2011) | 1 line

 

anhui 15*5

可以看到,建立分支的那一次提交是r23950 ,则-r 23950:24050 和-c 24050 代表的是同一个 变更集 ,前者表示23950 ~24050 的差异,后者表示24050 这次提交的变更,其实它们都是一样的,都是24050 这次提交导致的变更。因此,假设我们已 经合并了-r A:B ,如果B 之后又有一系列提交,最新版本是C ,我们想把这之后所有的修改并过来,则需要-r B:C ,注意第二次包括了B

假设现在我们想要手动方式把这个分支的变更迁回主干。则命令为(需要排除两次merge

$ svn merge -r

$ svn merge -r

$ svn merge -r

如果用-c

$ svn merge -c

$ svn merge -c

撤销已提交操作(回滚)

merge 的另外一个用途是撤销已经提交的代码,具体的做法是反向merge ,用下面的命令撤销一次提交,假设url

$ svn merge -c

$ svn merge -r

第一个命令撤销版本号是A 的提交,注意版本号前面的减号。第二个命令撤销B ~C 的提交。执行完以后,再commit 。 当然,实际上svn 并不能删除任意一个版本,这些操作仍然都会在历史中,它的作用只是在当前的HEAD

注意事项

1.   为了防止造成破坏,可以带上--dry-run

2.   merge

3.   执行merge 操作以后,解决完冲突立即提交。这样可以保证本次提交代表了一次纯粹的merge 。例如上面的r24506 、r24615 ,在手工merge

4.   提交的注释中描述清楚当前是从哪个版本merge

5.   在根目录执行merge 操作,避免在子目录和文件中留下mergeinfo

彩票SVN

创建代码分支

以lottery

svn cp

http://svn.taobao-develop.com/repos/lottery/branches/V${ 当前主干版本号}_${ 项目名称}_${date}/lottery \

-m " 创建XXX 项目分支" --parents

可以到http://svn.taobao-develop.com/repos/lottery/branches/

合并主干的最新修改到分支

开发一段时间以后,需要将主干的最新修改合并到项目分支。进入分支工作拷贝的根路径(请注意一定要在根路径进行操作),运行

1.   svn info

2.   svn st

3.  

4.   svn merge http://svn.taobao-develop.com/repos/lottery/trunk/lottery

5.   人肉解决冲突,可以用svn st 查看(*nix 下用svn st | grep ^C 查看) 是否有冲突,C 开头的文件标识有冲突,解决完以后用svn resolved path/filename

6.   svn st

7.  

合并分支修改到主干

上日常的时候,需要将项目分支修改合并到日常服务器的主干工作拷贝,但是不提交。在主干工作拷贝根路径(请注意一定要在根路径进行操作)下执行以下操作

1.   svn info

2.   svn st

3.  

4.   svn merge http://svn.taobao-develop.com/repos/lottery/branches/V${ 当前主干版本号}_${ 项目名称}_${date}/lottery --reintegrate

5.   人肉解决冲突,可以用svn st 查看(*nix 下用svn st | grep ^C 查看) 是否有冲突,C 开头的文件标识有冲突,解决完以后用svn resolved path/filename

6.   svn st

删除代码分支(项目预发后删除代码分支)

随便找个目录,执行下面的命令(lottery 和keno

svn mv 当前主干版本号}_${ 项目名称}_${date}/lottery \

http://svn.taobao-develop.com/repos/lottery/branches/backup_branches/V${ 当前主干版本号}_${ 项目名称}_${date}/lottery \

-m " 删除${ 项目名称} 代码分支"

项目合并

可先从主干拉一个分支,两个项目分别将自己的修改合并到这个分支。上日常的时候再将这个分支合并到主干。