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