![](https://i-blog.csdnimg.cn/blog_migrate/b3077e967045099433eec7b019e49b16.png)
![](https://i-blog.csdnimg.cn/blog_migrate/78589ec95d1ee0c764c9bc23ec4f436e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6d52feb493478ddd6d9ba647284d7ff9.png)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
本文介绍了配置管理员和高级用户可能用到的其他功能,分别为:
1,使用“锁定-编辑-解锁”模型
2,自动化属性
3,忽略文件
4,关键字替换
5,外部定义
1,使用“锁定-编辑-解锁”模型
Subversion使用与CVS相似的工作模型,也就是“拷贝-修改-合并”,但是有时候还是很有必要使用“锁定-编辑-解锁”模型,例如对于二进制文件,或者其他不太适合合并的文件。
属性在《使用Subversion进行版本控制》这本书里也被称为元数据,是附加到版本控制下的文件之上的属性,就像最后的修改日期是一个文件的属性一样,你可以为Subversion控制之下的文件和目录设置自定义的属性。关于属性的详细信息可以看:http://www.subversion.org.cn/svnbook/1.2/svn.advanced.locking.html#svn.advanced.locking.lock-communication 。
在Subversion 里是通过内置的属性“svn:needs-lock”实现“锁定-编辑-解锁”模型的,例如我们有一个word文件“介绍.doc”,大家很清楚Word 文件是二进制格式(据说以后都是XML的,但是可能也无法灵活的合并),不可能使用“拷贝-修改-合并”模型,所以我们要使用“锁定-编辑-解锁”模型。你可以将它设置属性“svn:needs-lock”,然后提交,之后其他人在更新这个文件的时候,就会得到一个只读的文件,他们想修改这个文件必须首先获得锁,获得锁的过程会将文件置为可写,而其他人此时如果想得到锁就会发现做不到,只有得到锁的人放弃锁定,别人才能得到锁,继续工作。下面分别讲述了如何使用svn命令行和TortoiseSVN设置锁和使用锁。
1) 设定“svn:needs-lock”属性
使用命令行锁定“介绍.doc”:
svn propset svn:needs-lock 'x' 介绍.doc
运行这个命令后,“介绍.doc”就已经是设置了“svn:needs-lock ”,但为了使之生效还要运行“svn commit”,之后其他用户update的时候就会发现这个文件已经是只读的了。需要注意的是我们设置的属性值是“x”,实际上任意值都可以, Subversion会忽略其内容。
使用TortoiseSVN设定属性也很简单:
“介绍.doc”右键选中- >属性->Subversion选项夹->properties->add,然后在弹出的窗口中的property name选择“svn:needs-lock”,值任意,然后选择OK。之后再提交“介绍.doc”即可。
2)获取锁
在设定了这个属性之后,我们要想修改“介绍.doc”,就必须首先获得锁,使用命令行操作如下:
svn lock 介绍.doc
这样“介绍.doc”就变成了可写文件,你可以进行编辑修改了,这个时候如果有人和你一样期望获得这个文件的锁就会得到错误的提示,表示文件已经被你锁定了。
使用TortoiseSVN的操作依然简单,“介绍.doc”右键选中-> TortoiseSVN -> Get Lock... ,然后输入锁定的注释,选择“OK”,既完成了锁定。
3)释放锁
当你完成了修改,选择提交后,默认就会释放锁,别人就可以重新获得锁。当然你也可以放弃修改,直接选择释放锁,操作如下:
svn unlock 介绍.doc
这样“介绍.doc”就重新变成只读,别人就可以获得锁并进行修改了。
使用TortoiseSVN的操作为,“介绍.doc”右键选中-> TortoiseSVN -> Release Lock,然后选择确认即可。
2,自动化属性
论坛里曾经有人问到如何实现前一个问题,然后又问到如果有很多文件需要做这样的设置该如何处理。这时可能就需要自动化属性功能,通过文件名匹配的方式将某类文件设置某种属性。我们还是以Word文档为例,设定将所有Word文档设置为只读。
这里我们用到了Subversion的运行配置区特性,Subversion的许多全局的配置参数都是放在运行配置区中,运行配置区实际上就是一个目录,在我的XP操作系统这个目录是“C:\Documents and Settings\rock\Application Data\Subversion”,其中rock是我的用户名,在UNIX下这个目录可能是“.subversion”。在这个目录里config文件是客户端操作的一些属性,而servers则是服务器端的属性,这一部分我们要使用config文件。
打开运行配置区的config文件,去掉“enable-auto-props = yes”前面的“#”和空格,然后找到“[auto-props]”小节,增加下面的属性并保存即可实现Word文件的自动添加需要锁定的属性:
*.doc = svn:needs-lock=x
作了这个设置后,以后通过“svn add”和“svn import”添加的*.doc文件都会有“svn:needs-lock”属性,当然你愿意,你也可以把上面的值修改为“* = svn:needs-lock=x”,这样所有新加的文件都是进入了“锁定-编辑-解锁”模型。
需要注意的是这些设置是针对客户端的,其他用户还需要做同样的设置。
3,忽略文件
在执行svn status等操作时,我们不想看到某些文件,就要使用设置属性进行忽略。在Subversion有两种方式进行这个设置,一个是更改全局设置,也就是前面提到的config文件,另一个是使用svn的内置属性“svn:ignore”。
1)使用config的global-ignores配置
假定我们的程序会编译出很多exe文件,如果不使用忽略属性,当我们执行“svn status”结果会是这个样子:
? admin\test.exe
M admin\test.txt
为了不让exe文件打扰我们,我们只需找到config文件的[miscellany]小节,修改global-ignores,增加对exe的忽略,我修改后的这一行变成:
global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store *.exe
然后再执行“svn status”,结果如下:
M admin\test.txt
2)使用svn的内置属性“svn:ignore”
有时候匹配没有这么普遍,例如Java的工程会在bin目录生成的很多临时Jar文件,我们只需要a.jar,而不希望temp.jar影响我们的视线,所以我们只需要设置bin的属性“svn:ignore”为temp.jar即可,具体设置同上。
关于忽略的更多信息见:http://www.subversion.org.cn/svnbook/1.2/svn.advanced.props.html#svn.advanced.props.special.ignore
4,关键字替换
在CVS里有一个很有用的功能,就是将源文件中的一些关键字替换,例如提交时间,作者等。Subversion默认不会对此类关键字进行处理,需要设置一些属性,才能实现。
例如我们要在某个源文件的头上自动添加最后一个修改人的名字和提交的时间,首先我们为这个文件设置属性svn:keywords的值为“Date Author”,然后在这个文件需要添加作者和提交时间的地方增加下面这样的字段:
$LastChangedDate$
$Author$
这样这个文件提交后,对应的字符变成了下面的样子:
$LastChangedDate: 2006-11-29 22:58:16 +0800 (星期三, 29 十一月 2006) $
$Author: root $
这里还存在一个问题,就是Subversion总是使用UTF-8替换文本,文件必须使用UTF-8编码。如果我们的文件编码是GBK,而日期显示格式是上面的汉字形式,那得到的时间将是乱码的。目前最实际的解决办法是所有的文件使用UTF-8编码;或者是尽量使出现的数据没有汉字,例如对于路径都是使用英文,对于时间使用英语的区域选项(我调整了中文的格式,但是无效)。
这部分的问题我想也可以通过属性实现,但是需要修改源程序,可能还不能马上实现。
更多可以使用关键字可以见:
http://www.subversion.org.cn/svnbook/1.2/svn.advanced.props.html#svn.advanced.props.special.keywords
5,外部定义
这个功能也是论坛里经常被问到的一个问题,就是很多人希望有VSS的share功能,也就是一个文件在版本库的多个位置有映像,一个地方修改,其它所有位置都能够看到。
Subversion通过外部定义(svn:externals)属性,能够实现目录的共享,但是对于文件,则只能支持类UNIX下的链接,这部分内容《使用Subversion进行版本控制》已经说得很清楚了,所以大家直接看书吧:
http://www.subversion.org.cn/svnbook/1.2/svn.advanced.externals.html
关于“共享(share)”功能,《软件配置管理》一书有过评价,它认为这个功能不是很好的软件配置管理习惯,如果一个文件可以被共享,也意味这个文件似乎可以成为独立的模块,需要重新规划了。