SVN中的属性是指附着在某个文件,某个目录,或者某个版本库上的键值对,与文件或者版本库的内容相比,它们算是某种隐形内容。可以在一个对象上附着任意多个属性(键值对),唯一的限制就是内存。键名由ASCII字符组成,类似变量名,键值则可以是任意值,包括字符串和二进制。
属性的修改,提交,更新,冲突解决与内容的修改,提交,更新,冲突解决一致。
SVN支持两种类型的属性:版本化属性和非版本化属性。
版本化属性依赖于某一个版本文件或目录而存在,与文件内容一样,接受版本控制。提交针对某个文件或者目录属性的修改,与提交文件内容的修改一样,会产生新的修订版本号(revision number)
非版本化属性则针对整个版本库,与某个修订版本号(revision number)对应,它显然是无法接受版本控制的(当然你可以查看它在上一个修订号时的值,如果有的话)。
可以自己定义并添加属性,但是很多实践者并不鼓励这种做法,因为属性类似隐形内容,难以搜索和管理。在实践中,一般是在提交修改时,在log中嵌入一些信息(最好预先设定log的格式,便于编程处理),携带想要的键值对。这种做法当然只能与某次版本对应,但是对于大部分实践,已经够了。
自定义版本化属性的一个例子是:图片文件的版权信息。
自定义非版本化属性的一个例子是:提交对应的bug ID。
那么,SVN属性的重点是,它自身使用一些保留属性为使用者提供方便的特性。这些保留属性的名字以svn:开头,自定义属性的名字最好不要也以这个开头。svn在提交的时候,会自动添加一些保留属性,比如:svn:mime-type,svn:executable。svn还允许定一些配置信息,自定义自动化属性设置。
保留的版本化属性举例:svn:mime-type,它的值是文件对应的mime类型。
保留的非版本化属性举例:svn:date(版本提交的日期),svn:author(版本提交的作者),svn:log(版本提交的日志信息)。
属性操作举例:
1.添加一个版本化属性:
svn propset copyright '(c) 2006 Red-Bean Software' calc/button.c(设置button.c的版权信息)
svn propset license -F /path/to/LICENSE calc/button.c(设置button.c的版权信息,LICENSE的内容被作为licence的值)
svn propset copyright '(c) 2006 Red-Bean Software' calc/*(设置calc目录下所有文件的版权信息)
svn propedit copyright calc/button.c(设置或者编辑button.c文件的版权信息,推荐的修改方式)
2.列出属性:
svn proplist calc/button.c
输出:
Properties on 'calc/button.c':
copyright
license
svn proplist -v calc/button.c
输出:
Properties on 'calc/button.c':
copyright
(c) 2006 Red-Bean Software license(c) 2006 Red-Bean Software
svn propget copyright calc/button.c
输出:
(c) 2006 Red-Bean Software
3.删除属性:
svn propdel license calc/button.c
4.操作非版本化属性(可能存在权限问题,需要svn服务器允许):
svn propset svn:log "* button.c: Fix a compiler warning." -r11 --revprop
svn propset svn:log "* button.c: Fix a compiler warning." -r11 --revprop http://svn.example.com/repos/project