钩子脚本是通过一些仓库事件触发的程序,例如创建新版本或修改未版本化属性。每个钩子都传递了足够的信息来告知该事件是什么,其操作的目标是什么,以及触发该事件的用户的用户名。根据钩子的输出或返回状态,钩子程序可以继续操作、停止操作或以某种方式暂停操作。有关已实现钩子的详细信息,请参阅 Subversion 手册中关于 钩子脚本 的章节。
这些钩子脚本由托管仓库的服务器执行。TortoiseSVN 还允许您配置在某些事件发生时在本地执行的客户端钩子脚本。有关更多信息,请参阅 名为“客户端钩子脚本”的部分。
可以在仓库的 hooks
目录中找到示例钩子脚本。这些示例脚本适用于 Unix/Linux 服务器,但如果您的服务器是基于 Windows 的,则需要进行修改。钩子可以是批处理文件或可执行文件。以下示例显示了一个可能用于实现 pre-revprop-change 钩子的批处理文件。
rem Only allow log messages to be changed. if "%4" == "svn:log" exit 0 echo Property '%4' cannot be changed >&2 exit 1
请注意,发送到 stdout 的任何内容都会被丢弃。如果您希望在提交拒绝对话框中显示消息,则必须将其发送到 stderr。在批处理文件中,这是使用 >&2
实现的。
如果钩子脚本拒绝您的提交,那么它的决定是最终的。但是,您可以使用 魔法词 技术在脚本本身中构建一个覆盖机制。如果脚本想要拒绝操作,它首先会扫描日志消息以查找特殊的通过短语,可以是固定短语,也可以是带有前缀的文件名。如果它找到了魔法词,则允许提交继续。如果没有找到短语,它可以使用类似 “你没有说出魔法词” 的消息阻止提交。:-)