Hook 脚本是由版本库事件触发的程序,例如创建新版本或修改未版本控制的属性。每个 hook 都会获得足够的信息来告知事件类型、操作的目标以及触发事件的用户的用户名。根据 hook 的输出或返回状态,hook 程序可以继续操作、停止操作或以某种方式暂停操作。有关已实现的 hook 的完整详细信息,请参阅 Subversion Book 中关于 Hook Scripts 的章节。
这些 hook 脚本由托管版本库的服务器执行。TortoiseSVN 还允许您配置客户端 hook 脚本,这些脚本在某些事件发生时在本地执行。有关更多信息,请参阅名为“客户端 Hook 脚本”的章节。
示例 hook 脚本可以在版本库的 hooks
目录中找到。这些示例脚本适用于 Unix/Linux 服务器,但如果您的服务器是基于 Windows 的,则需要进行修改。hook 可以是批处理文件或可执行文件。下面的示例展示了一个批处理文件,该文件可能用于实现 pre-revprop-change hook。
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
来实现。
如果 hook 脚本拒绝您的提交,则其决定是最终的。但是,您可以使用 Magic Word 技术在脚本本身中构建覆盖机制。如果脚本想要拒绝操作,它首先扫描日志消息中是否存在特殊的密码短语,可以是固定的短语,也可以是带有前缀的文件名。如果找到 magic word,则允许提交继续进行。如果未找到该短语,则可以使用类似 “你没有说 magic word” 的消息阻止提交。:-)