首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

Subversion 学习 3 高级功能

2012-07-27 
Subversion 学习 三 高级功能关于revision在不可能记住每个revision的具体号码的情况下,SVN 提供了DATE,ke

Subversion 学习 三 高级功能

关于revision

在不可能记住每个revision的具体号码的情况下,SVN 提供了DATE,keyword两种额外的方式,同时这三种可以混用

Eg: svn diff –r 1:HEAD (数字与keyword结合)

SVN中的revision KEYWORD:

HEAD : 版本库中最新的(最年轻的)的版本

BASE : 本地的工作副本的revision,指的是如果当前file被修改,则修改前的revision

COMMITTED: 项目最近的修订版本,与BASE相同或更早

PREV:最后一次修改的revision的之前一个revision,基本上是COMMITED-1

?

Revision时间表示:

$ svncheckout -r {2006-02-17}

$ svncheckout -r {15:30}

$ svncheckout -r {15:30:00.200000}

$ svncheckout -r {"2006-02-17 15:30"}

$ svncheckout -r {"2006-02-17 15:30 +0230"}

$ svncheckout -r {2006-02-17T15:30}

$ svncheckout -r {2006-02-17T15:30Z}

$ svncheckout -r {2006-02-17T15:30-04:00}

$ svncheckout -r {20060217T1530}

$ svncheckout -r {20060217T1530Z}

$ svncheckout -r {20060217T1530-0500}

使用{}包括的,符合ISO-8601的

?

属性

属性是SVN中的高级功能,指的是在版本库的文件,目录上都可以绑定任意的name=value对,作为属性,name,value都可以是任意值,name必须是ASCII的,同时这些属性,也可以跟文件,目录一下,被SVN记录历史,也就是说属性的修改可以回退。Revision也可以有属性,与前面不同的是,revision的属性不可以记录历史,一旦修改就不可回退,同时SVN自己定义了一些属性,使用svn:

前缀,像revision的svn:date,svn:author, svn:log等,因为属性的不确定存在性,尽量不要假设某些属性存在。

属性的使用,主要是在一些自动化脚本中,对SVN库中的文件进行的处理

?

SVN的属性是很难定位的,很难去寻找一个需要的属性(往往需要递归),所以把信息放在log中是比较好的选择,可以使用svn log看到.

?

添加:

a)纯文本

svn propsetcopyright ‘(c) 2006 Red-Bean Software' calc/button.c

b)从文件读取(――file)

svn propsetlicense –F /path/to/LICENSE calc/ button.c

属性name必须以字符,_或: 起始,后面可以添加字母,数字,-,点号(.),

?

?

修改:

propedit

修改时,会打开一个用编辑器打开一个临时文件,同时修改,保存,如果不修改,不保存直接退出,SVN不会做任何事

svn propeditcopyright calc/button.c

?

同时,关于property的操作,可以把多个文件放在一起操作,使用通配符

$ svn propsetcopyright '(c) 2006 Red-Bean Software' calc/*

property'copyright' set on 'calc/Makefile'

property'copyright' set on 'calc/button.c'

property'copyright' set on 'calc/integer.c'

?

显示:

proplist

svn proplistcalc/button.c

默认情况下显示提供路径下的文件名,和它的property的name

添加――verbose(-v)选项会显示value

svn proplist –vcalc/button.c

?

propget

通过文件名,proerty name去get value

svn propgetcopyright calc/button.c

?

?

删除:

svn propdelcopyright calc/button.c

?

属性与SVN工作流

所有设置的属性只有在svn commit之后才能永久生效,否则一个svn revert就回去了,同时属性也存在conflict

一旦使用svnstatus calc/button.c 查看修改了属性而没有修改内容的文件,会发现M状态标志出现在第二列,而不是第一列,同时svn diff calc/button.c提示显示property changes

?

$ svnstatus calc

Mcalc/button.c

?calc/calculator

?calc/data.c

?calc/debug_log

?calc/debug_log.1

?calc/debug_log.2.gz

calculator

$ svnstatus

M calc

Mcalc/button.c

$ svn status--no-ignore

M calc

Icalc/calculator

?calc/data.c

Icalc/debug_log

Icalc/debug_log.1

Icalc/debug_log.2.gz

LastChangedRevision or Rev

$Id: calc.c 148 2006-07-28 21:30:43Z sally $, calc.c的文件 版本号148 在2006.7.28 21:30:43(UTC)时间被sally修改

?

?

稀疏目录

在svn checkout命令的时候,一般我们都会把URL下的所有子目录,文件都递归的checkout,但是如果我们不想这样怎么做?

使用- -depth选项,它可以让我们有选择的下载需要的file和目录,有4种

?

这个选项和老的选项 - -no-recursive(-N) 和 - -recursive(-R)相似。

?

同时,不只checkout命令可以使用,在svn update, svn switch都可以

使用方式略有不同, svn update - -set-depthNEW-DEPTH TARGET

Eg: svn update - -set-depth files mom-empty

?

同时,使用svn info命令可以查看当前目录的depth情况

Eg: svn info mom-empty | grep “^Depth:”

?

?

?

锁定

在面对不是textContent的file的时候,SVN不能做到merge,因此一旦出现conflict就需要手动的resolve,但是SVN提供了一种lock机制,能手动的lockfile然后别人就不能commit,直到lockercommit然后解锁。

使用svn lock命令

Eg: svn lock branck.jpg –m “this ismodified by Joel”

-m 提供comment,像commit一样,区别的是这里的-m是可选的

这时候可以通过svn status, svn info 查看,

?Svn status 可以看到file的状态为 K

Svn info 可以看到更多的信息,包括lock时 创建的token(随机),这个token是保存在工作副本的本地,在commit的时候进行验证,确保是locker进行的提交

?

解锁:

?

其他用户,在commit的时候,如果对lock file进行修改,会报错。

这些用户可以通过svn info URL 来对lock 的file进行查询,可以看到locker和lock的token

?

其他用户解锁

其他用户可以broke的lock,通过svnlock 和svnadmin工具

Eg:svnadmin lslocks TARGET

可以显示这个TARGET目录下的所有lock,或这个TARGETfile的lock

?

svnadmin rmlocks DICTIONARY TARGET

解除指定目录下的,指定file的lock

?

同时,可以通过- -force选项,使用svn unlock强行解锁

svn unlock - -force URL

必须使用file的URL(repository地址)来进行解锁

?

同时,可以通过- -force选项,把broke lock和re-lock结合一起,作为一个atmoic的命令

Eg: svn lock - -force file

这里不需要URL,只需本地的路径即可,这时不论file之前被lock与否,都被当前用户给lock了,这时之前的locker,如果svnstatus - -show-updates(-u)会看到B或T状态,标志lock被Broke或sTolen

?

?

?

外部定义

解决的问题: 当需要checkout不同的多个subdictionary,而且多次时会显得很麻烦,这时可以用到外部定义,它在目录上定义一个svn:externals属性,包含一些URL,在checkout当前这个目录的时候,就会接着去下载externals中定义的URL。

?

在1.5之前,定义格式为:

$ svnpropget svn:externals calc

third-party/soundshttp://svn.example.com/repos/sounds

third-party/skins-r148 http://svn.example.com/skinproj

third-party/skins/toolkit-r21 http://svn.example.com/skin-maker

本地存放路径? URL

?

在1.5时,格式可以为:

$ svnpropget svn:externals calc

http://svn.example.com/repos/soundsthird-party/sounds

-r148http://svn.example.com/skinproj third-party/skins

-r21http://svn.example.com/skin-maker third-party/skins/toolkit

?

$ svnpropget svn:externals calc

http://svn.example.com/repos/soundsthird-party/sounds

http://svn.example.com/skinproj@148third-party/skins

热点排行