在Windows环境中,咱们通常使用TortoiseSVN来搭建svn环境。在Mac环境下,因为Mac自带了svn的服务器端和客户端功能,因此咱们能够在不装任何第三方软件的前提下使用svn功能,不过还需作一下简单的配置。
咱们首先来看下,如何在Mac环境下搭建svn服务器端环境。php
1、建立代码仓库,用来存储客户端所上传的代码
我先在/User/apple目录下新建一个svn目录,之后能够在svn目录下建立多个仓库目录
打开终端,建立一个mycode仓库,输入指令:svnadmin create /Users/apple/svn/mycode
指令执行成功后,会发现硬盘上多了个/Users/apple/svn/mycode目录,目录结构以下:html
注:这地方出现路径的错误能够经过xcode
输入sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer命令浏览器
password是你的登陆密码。缓存
2、配置svn的用户权限
主要是修改/svn/mycode/conf目录下的三个文件
1.打开svnserve.conf,将下列配置项前面的#和空格都去掉服务器
C# code网络
|
anon-access = read表明匿名访问的时候是只读的,若改成anon-access = none表明禁止匿名访问,须要账号密码才能访问
2.打开passwd,在[users]下面添加账号和密码
[users]
mj=123
jj=456
账号是mj,密码是123
3.打开authz,配置用户组和权限
咱们能够将在passwd里添加的用户分配到不一样的用户组里,之后的话,就能够对不一样用户组设置不一样的权限,没有必要对每一个用户进行单独设置权限。
在[groups]下面添加组名和用户名,多个用户之间用逗号(,)隔开
[groups]
topgroup=mj,jj
说明mj和jj都是属于topgroup这个组的,接下来再进行权限配置。
使用[/]表明svn服务器中的全部资源库
[/]
@topgroup=rw上面的配置说明topgroup这个组中的全部用户对全部资源库都有读写(rw)权限,组名前面要用@
若是是用户名,不用加@,好比mj这个用户有读写权限
[/]
mj=rw
至于其余精细的权限控制,能够参考authz文件中的其余内容
4.启动svn服务器
前面配置了这么多,最关键仍是看可否正常启动服务器,若启动不来,前面作再多工做也是徒劳。
在终端输入下列指令:svnserve -d -r /Users/apple/svn
或者输入:svnserve -d -r /Users/apple/svn/mycode
没有任何提示就说明启动成功了
5.关闭svn服务器
若是你想要关闭svn服务器,最有效的办法是打开实用工具里面的“活动监视器”
这里列出一大堆svn指令,后面括号中的内容的通常表明着指令的简称,好比咱们能够用svn ci代替svn commit,用svn co代替svn checkout
注:首次配置完先关闭svn服务器再进行数据的上传和下载操做。
综合上述,咱们就能够轻松搭建svn服务器环境了
3、使用svn客户端功能
1.从本地导入代码到服务器(第一次初始化导入)
在终端中输入
svn import /Users/apple/Documents/eclipse_workspace/weibo svn://localhost/mycode/weibo --username=mj --password=123 -m "初始化导入"
我解释下指令的意思:将/Users/apple/Documents/eclipse_workspace/weibo中的全部内容,上传到服务器mycode仓库的weibo目录下,后面双引号中的"初始化导入"是注释
注:apple是用户名
2.从服务器端下载代码到客户端本地
在终端中输入svn checkout svn://localhost/mycode --username=mj --password=123 /Users/apple/Documents/code
我解释下指令的意思:将服务器中mycode仓库的内容下载到/Users/apple/Documents/code目录中
注:localhost(本地服务器IP地址)能够替换成你本地服务器的IP地址。当你和别人同用一个svn时,你能够输入你要进行数据请求的服务器的IP地址。
3.提交更改过的代码到服务器
在步骤2中已经将服务器端的代码都下载到/Users/apple/Documents/code目录中,如今修改下里面的一些代码,而后提交这些修改到服务器
1> 打开终端,先定位到/Users/apple/Documents/code目录,输入:cd /Users/apple/Documents/code
2> 输入提交指令:svn commit -m "修改了main.m文件"
这个指令会将/Users/apple/Documents/code下的全部修改都同步到服务器端,假如此次我只修改了main.文件
能够看到终端的打印信息:
Sending weibo/weibo/main.m
Transmitting file data .
Committed revision 2.
4.更新服务器端的代码到客户端
这个应该是最简单的指令了,在终端中定位到客户端代码目录后,好比上面的/Users/apple/Documents/code目录,而后再输入指令:svn update
5.至于svn的其余用法,能够在终端输入:svn help
注:一、系统自带的svn没法支持本地删除文件的更新,即当本地删除文件后去更新服务器的文件时,删除的文件又从服务器上的文件夹中下载到你的本地文件夹中。可是它是支持文件修改后的更新操做的。
二、记得写注释,不然系统不会识别命令的。
打开终端,进到所在的目录,而后出入一下代码
find . -name ".svn" | xargs rm -Rf
一、将文件checkout到本地目录
svn checkout path(path是服务器上的目录)
例如:svn checkout svn://192.168.1.1/pro/domain
简写:svn co
二、往版本库中添加新的文件
svn add file
例如:svn add test.php(添加test.php)
svn add *.php(添加当前目录下全部的php文件)
svn add xxx@2x.png 文件时, 正常命令 svn add xxx@2x.png 会报 xxx not found
需用 svn add xxx@2x.png@ 来添加,也就是图片名字后面再添加一个@ 符号,
这是由于 svn 命令最后须要用@符号来指定一个版本致使的
遇到 xxx@2x.png文件时,若是用svn命令行添加到 版本库的话,只能手动一个一个添加,不能批量添加
三、将改动的文件提交到版本库
svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(若是选择了保持锁,就使用–no-unlock开关)
例如:svn commit -m “add test file for my test“ test.php
简写:svn ci
四、加锁/解锁
svn lock -m “LockMessage“ [--force] PATH
例如:svn lock -m “lock test file“ test.php
svn unlock PATH
五、更新到某个版本
svn update -r m path
例如:
svn update若是后面没有目录,默认将当前目录以及子目录下的全部文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。若是在提交的时候提示过时的话,是由于冲突,须要先update,修改文件,而后清除svn resolved,最后再提交commit)
简写:svn up
六、查看文件或者目录状态
1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预约加入到版本库;K:被锁定】
2)svn status -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工做版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的状况下也能够执行的,缘由是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
七、删除文件
svn delete path -m “delete test fle“
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
或者直接svn delete test.php 而后再svn ci -m ‘delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
八、查看日志
svn log path
例如:svn log test.php 显示这个文件的全部修改记录,及其版本号的变化
九、查看文件详细信息
svn info path
例如:svn info test.php
十、比较差别
svn diff path(将修改的文件与基础版本比较)
例如:svn diff test.php
svn diff -r m:n path(对版本m和版本n比较差别)
例如:svn diff -r 200:201 test.php
简写:svn di
十一、将两个版本之间的差别合并到当前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差别合并到当前文件,可是通常都会产生冲突,须要处理一下)
十二、SVN 帮助
svn help
svn help ci
1三、版本库下的文件和目录列表
svn list path
显示path目录下的全部属于版本库的文件和目录
简写:svn ls
1四、建立归入版本控制下的新目录
svn mkdir: 建立归入版本控制下的新目录。
用法: 一、mkdir PATH…
二、mkdir URL…
建立版本控制的目录。
一、每个以工做副本 PATH 指定的目录,都会建立在本地端,而且加入新增
调度,以待下一次的提交。
二、每一个以URL指定的目录,都会透过当即提交于仓库中建立。
在这两个状况下,全部的中间目录都必须事先存在。
1五、恢复本地修改
svn revert: 恢复原始未改变的工做副本文件 (恢复大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不会存取网络,而且会解除冲突的情况。可是它不会恢复
被删除的目录
1六、代码库URL变动
svn switch (sw): 更新工做副本至不一样的URL。
用法: 一、switch URL [PATH]
二、switch –relocate FROM TO [PATH...]
一、更新你的工做副本,映射到一个新的URL,其行为跟“svn update”很像,也会将
服务器上文件与本地文件合并。这是将工做副本对应到同一仓库中某个分支或者标记的
方法。
二、改写工做副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变更
(好比方案名或是主机名称变更),可是工做副本仍旧对映到同一仓库的同一目录时使用
这个命令更新工做副本与仓库的对应关系。
1七、解决冲突
svn resolved: 移除工做副本的目录或文件的“冲突”状态。
用法: resolved PATH…
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,而后让 PATH 能够再次提交。
1八、输出指定文件或URL的内容。
svn cat 目标[@版本]…若是指定了版本,将从指定的版本开始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也能够写具体版本号,这样输出结果是能够提交的)
1九、配置忽略文件 vi ~/.subversion/config
找到 global-ignores 一行,去掉注释,编辑成
global-ignores = build *~.nib *.so *.pbxuser *.mode *.perspective*
找到 enable-auto-props = yes 把注释去掉,在[auto-props] Section声明如下文本文件
*.mode* = svn:mime-type=text/X-xcode
*.pbxuser = svn:mime-type=text/X-xcode
*.perspective* = svn:mime-type=text/X-xcode
*.pbxproj = svn:mime-type=text/X-xcode
=========================================
svn 命令共同的选项
--targets list 读取list并将其解释为一个将要操做的参数列表
--non-recurisive, –N 只操做单个目录,不处理子目录
--verbose, –v 打印额外的信息
--quiet, –q 打印的信息尽量少
--username, name 指定在链接受权时使用的用户名
--password, pawd 指定要使用的密码
--no-auth-cache 不要缓存身份令牌
--non-interactive 不要提示输入额外的信息
--config-dir dir 从dir读取用户配置
--editor-cm cmd 使用cmd做为日志消息的编辑器
svn add
把文件及目录的名称添加给版本控制系统。他们会在下次提交时被添加到项目仓库
svn add path
--auto-props 在添加他们的时候自动设置文件的属性
--no-auto-props 禁用自动属性设置
svn blame
显示文件每行的版本及做者信息
--revision, –r rev 若是指定的rev是单个版本,显示该版本做者信息。若是是范围rev1:rev2, 显示rev2版本做者的信息,但只检查版本到rev1.
svn cat
输出指定文件或者URL的内容
svn cat target…
--revision, –r rev
svn checkout
从项目仓库牵出一个工做拷贝
svn checkout url…path
若是没有指定path,签出的本地目录名使用URL的base name.
svn cleanup
清理工做拷贝,移除锁,完成未完成的操做,等等。
svn cleanup path…
svn commit path
把改动从你的工做拷贝发送到项目仓库
--message, –m msg 使用msg做为提交日志消息。
--file, –F file 使用file的内容做为提交日志消息。
--no-unlock 不要在提交的时候释放锁。
svn copy
在工做拷贝或者项目仓库中制造包括历史在内的复本
svn copy src dest
src和dest能够是工做拷贝(WC)的路径或者URL.
src dest 效果……
WC WC 拷贝并添加
WC URL 当即提交WC的拷贝到URL
URL WC 签出URL到WC, 添加
URL URL 彻底服务器端拷贝;用于制做分支和打标签
--revision, –r rev要拷贝的src的版本。只在src是项目仓库的URL时才有意义。
svn delete target
从项目仓库删除文件或者目录。若是target是工做拷贝中的文件或者目录,它被从工做拷贝中移除而且预计在下次提交时删除掉。若是target是项目仓库URL,经过一次当即的提交从项目仓库中删除。
--message, –m msg
--file, –F file
svn diff
显示两个路径之间的差别
svn diff –r rev1:rev2 target…
svn diff oldurl newurl
svn export
建立一个无版本记录的拷贝.
svn export –r rev URL path
从项目仓库的指定URL导出一个干净的目录树到path中,若是指定了rev参数,导出rev版本的,不然处处最新版本。
svn import
提交一个无版本的文件或者树到项目仓库
svn import path URL
svn info
显示文件或者目录的信息。
svn list
列出项目仓库中的目录条数。
svn lock
锁住文件让其它用户不能提交改动。
svn lock target
--message, –m msg 使用msg做为锁信息消息
--force 强制加锁成功,经过从其余用户或者工做拷贝把锁给偷过来。
svn log
显示一些版本或者文件的日志消息.
--stop-on-copy 在遍历历史的时候不要穿越拷贝(对于查找分支的起点颇有用)
svn merge
把两个来源的差别应用给工做拷贝路径。
svn merge –r rev1:rev2 source wcpath
svn mkdir
建立版本控制下的新目录
svn mkdir target
svn move src dest
移动或者重命名工做拷贝或者项目仓库中文件或者目录。
--revision, –r rev使用版本rev做为源来执行此次移动。
svn propdel
删除文件或者目录的属性
svn propdel propname path…
svn propedit
编辑文件或者目录的属性
svn propedit propname path…
svn propget
打印文件或者目录的属性值
svn propget propname path…
--strict 禁用额外的换行和其它的美化措施(在把二进制属性重定向到文件时会有用处)
svn proplist
列出文件或者目录的全部属性
--verbose
--recursive
--revision, –r rev 列出path在版本rev定义的属性
svn propset(pset, ps)
svn propset propname propval path…
--file, –F file 读取file的内容,使用它做为属性值.
--recursive
--encoding enc 把值做为用enc编码的字符集
svn resolved
移除工做拷贝文件或者目录的冲突状态
--recursive
svn revert
恢复工做拷贝的文件(撤销最新的本地修改)
svn revert path 这个命令不须要网络链接
--recursive
svn status
打印工做拷贝中文件或者目录的状态
svn status path…
--show-updates, –u 联系服务器显示更新信息
--no-ignore 忽视默认设置和svn:ignore属性设置的忽略项
--non-recursive, –N
--verbose, –v
svn switch
把工做拷贝转向到其余的URL
svn switch URL path
更新工做拷贝让其使用项目仓库的新URL.这个行为相似svn update 并且是一种把工做拷贝转向到同一项目仓库中的分支或者标签的办法。
--revision, –r rev 转向到版本rev
--non-recursive, –N
--diff3-cm 使用cmd做为合并命令
svn unlock
解开工做拷贝文件或者项目仓库URL的锁。
svn unlock target…
--force 砸坏现有对target的锁,甚至它不是被当前工做拷贝所拥有的。
svn update
把改动从项目仓库带到工做拷贝来。
svn update path…
--revision, –r rev 更新到版本rev
--non-recrusive, –N
--diff3-cmd
=========================================
-svn 出错信息总汇 . Subversion 错误信息一览表 注意: 不一样的客户端(命令行,TortoiseSVN, AnkhSVN, Subclipse等)的出错信息可能稍有不一样。 下面表格中的出错信息以 http://svn.moon.ossxp.com/svn/test 版本库作示例,仅供参考。 编号 出错信息 问题剖析 解决方案 1. svn: Server sent unexpected return value (500 I-
svn 出错信息总汇 . Subversion 错误信息一览表
注意:
不一样的客户端(命令行,TortoiseSVN, AnkhSVN, Subclipse等)的出错信息可能稍有不一样。
下面表格中的出错信息以 http://svn.moon.ossxp.com/svn/test 版本库作示例,仅供参考。
编号
出错信息
问题剖析
解决方案
1.
svn: Server sent unexpected return value (500 Internal Server Error) in response to OPTIONS request for 'http://svn.moon.ossxp.com/svn/test'
错误的用户名
检查登陆的用户名是否输入错误
svn: 服务器发送了意外的返回值(500 Internal Server Error),在响应 “OPTIONS” 的请求 “http://svn.moon.ossxp.com/svn/test” 中
2.
svn: OPTIONS of 'http://svn.moon.ossxp.com/svn/test': authorization failed: Could not authenticate to server: rejected Basic challenge (http://svn.moon.ossxp.com)
错误的口令
用正确的用户名/口令登陆
svn: 方法 OPTIONS 失败于 “http://svn.moon.ossxp.com/svn/test”: 认证失败: Could not authenticate to server: rejected Basic challenge (http://svn.moon.ossxp.com)
3.
svn: Server sent unexpected return value (403 Forbidden) in response to OPTIONS request for 'http://svn.moon.ossxp.com/svn/test'
用户无权限
联系管理员,为用户分配权限
svn: 服务器发送了意外的返回值(403 Forbidden),在响应 “OPTIONS” 的请求 “http://svn.moon.ossxp.com/svn/test” 中
4.
svn: OPTIONS of 'http://www.moon.ossxp.com/svn/test': 200 OK (http://www.moon.ossxp.com)
服务器地址错误,是普通Web页面,不支持SVN的 WebDAV 协议
确认输入正确的 SVN 服务地址。能够在浏览器中输入该地址进行确认
svn: 方法 OPTIONS 失败于 “http://www.moon.ossxp.com/svn/test”: 200 OK (http://www.moon.ossxp.com)
5.
The version of your subversion (client) is below 1.5.0, upgrade to 1.5.0 or above. SVN below 1.5.0 can not handle mergeinfo properly. It can mess up our automated merge tracking!
是因为客户端的软件版本低于1.5.0形成的。服务器端对客户端软件版本进行了限制,以避免对合并跟踪破坏。
升级本地的Subversion客户端软件到1.5.0或以上版本。
6.
svn: This client is too old to work with working copy '.'. You need to get a newer Subversion client, or to downgrade this working copy. See http://subversion.tigris.org/faq.html#working-copy-format-change for details.
安装了多个版本的SVN客户端(TSVN,Subclipse,...),且各个客户端的版本不一致。高版本的SVN客户端会自动更新本地工做目录中的 .svn 目录下的文件格式,致使旧版本的SVN客户端不能继续访问该本地工做目录
将本机安装的全部的SVN客户端都更新到同一个大版本,以免本地工做目录的格式不一致
-svn: 此客户端对于工做副本 . 太旧。你须要取得更新的 Subversion 客户端,或者降级工做副本。 参见 http://subversion.tigris.org/faq.html#working-copy-format-change 以得到更详细的信息。 7. svn: Working cop-
svn: 此客户端对于工做副本 “.” 太旧。你须要取得更新的 Subversion 客户端,或者降级工做副本。 参见 http://subversion.tigris.org/faq.html#working-copy-format-change 以得到更详细的信息。
7.
svn: Working copy 'trunk/src' locked svn: run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)
异常操做致使目录没有解锁。
一个简单的重现方法:在 .svn 目录下建立空的名为 lock 的文件
使用命令行 "svn cleanup" 或者相似的“清理”动做删除锁定
svn: 工做副本“trunk/src”已经锁定 svn: 运行“svn cleanup”删除锁定 (输入“svn help cleanup”获得用法)
8.
日志中没有做者信息: ------------------------------------ r9 | (没有做者信息) | … ossxp.com anonymous commit test
匿名提交致使没有做者信息
检查版本库权限控制,禁止匿名提交
9.
正在发送 ... 传输文件数据.svn: 提交失败(细节以下): svn: Commit blocked by pre-commit hook (exit code 1) with output: 提交说明至少应包含 4 个字符, 或者太简单了。
这是因为用户提交的提交说明(commit log),太过简单了。在提交时须要输入有意义的 commit log。
写有意义的提交说明,或者请求管理员更改版本库插件
10.
增长 Logger.c 传输文件数据.svn: 提交失败(细节以下): svn: Commit blocked by pre-commit hook (exit code 1) with output: Wide character in print at /opt/svn/svnroot/myrepos/hooks/scripts/check-case-insensitive.pl line 259. 发现文件名大小写冲突: trunk/src/Logger.c 已经存在于 logger.c
管理员设置了对新增文件是否重名(只有大小写不一样)的文件进行检查。文件名只有大小写不一样,在Windows上进行检出会形成麻烦
不要添加剧名(仅大小写不一样)文件
增长 src/文件aBc.txt 传输文件数据.svn: 提交失败(细节以下): svn: Commit blocked by pre-commit hook (exit code 1) with output: Clash: '/trunk/src/文件aBc.txt' '/trunk/src/文件abc.txt'
11.
svn: While preparing '/home/jiangxin/tmp/svn.test/trunk/src/README.txt' for commit svn: Inconsistent line ending style
提交的文件已经设置了 svn:eol-style 属性,可是该文本内的换行符有DOS的换行符CRLF,也有Unix换行符LF,不一致!
统一该文本文件内的换行符。Linux 下能够用dos2unix, unix2dos, sed等命令。Windows下可用 UltraEdit 进行转换。
svn: 当为提交操做准备“/home/jiangxin/tmp/svn.test/trunk/src/README.txt”时 svn: 不一致的行结束样式
12.
svn: Failed to add file 'Makefile': an unversioned file of the same name already exists
执行更新(svn up)时报错。由于其余人新增一个文件到服务器,而本地却存在一个同名文件(未版本控制)
先将本地重名文件更名,再执行 "svn up",以后再比较、合并文件。或者执行 "svn up --force"
-svn: 增长文件 'Makefile' 失败: 同名未版本控制的文件已存在 13. Adding src/Makefile svn: Commit failed (details follow): svn: File '/svn/test/trunk/src/Makefile' already exists 添加新文件,提交时报错。-
svn: 增长文件 'Makefile' 失败: 同名未版本控制的文件已存在
13.
Adding src/Makefile svn: Commit failed (details follow): svn: File '/svn/test/trunk/src/Makefile' already exists
添加新文件,提交时报错。由于其余人已经先于我增长了该文件。
先执行更新操做("svn up"),再根据提示进行操做:合并/提交...
增长 src/Makefile svn: 提交失败(细节以下): svn: 文件“/svn/test/trunk/src/Makefile”已存在
14.
$ svn up Conflict discovered in 'Makefile'. Select: (p) postpone, (df) diff-full, (e) edit, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options: p C Makefile Updated to revision 5. Summary of conflicts: Text conflicts: 1
多人同时编辑同一个文件时,可能会遇到冲突。别人先于我提交,则当我提交时要先更新。更新可能遇到不能自动解决的冲突
使用工具进行冲突解决
$ svn up 在 “Makefile” 中发现冲突。 选择: (p) 推迟,(df) 显示所有差别,(e) 编辑, (mc) 个人版本, (tc) 他人的版本, (s) 显示所有选项: p C Makefile 更新到版本 5。 冲突概要: 正文冲突:1
15.
svn: Commit failed (details follow): svn: File 'Makefile' is out of date svn: File not found: transaction '6-d', path '/trunk/src/Makefile'
提交的文件已被他人删除
先执行更新操做("svn up"),再根据提示解决该树冲突:删除文件或继续添加...
svn: 提交失败(细节以下): svn: 文件 “Makefile” 已通过时 svn: File not found: transaction '6-c', path '/trunk/src/Makefile'
16.
svn: Commit failed (details follow): svn: File or directory '/trunk/XXX' is out of date; try updating svn: resource out of date; try updating
基于旧版本修改是不容许的
先更新("svn update"),再提交
svn: 提交失败(细节以下): svn: 文件或目录 “/trunk/XXX” 已通过时;请先更新 svn: resource out of date; try updating
17.
svn: DAV request failed; it's possible that the repository's pre-revprop-change hook either failed or is non-existent svn: At least one property change failed; repository is unchanged svn: Error setting property 'log': Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
修改提交说明等操做属于高风险操做,由于该操做没有被版本控制,属于不可恢复的操做。缺省禁止。
请联系管理员,启用该版本的相关钩子,容许修改“版本属性”。参见 管理员钩子设置
svn: DAV 请求失败;多是版本库的 pre-revprop-change 钩子执行失败或者不存在 svn: 至少有一个属性变动失败;版本库未改变 svn: 设置属性 “log” 出错: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook