我想在资源库浏览器中编辑日志注释,并收到一条错误消息,指出该资源库不存在pre-revprop-change挂钩。除了具有可怕的名称之外,什么是pre-revprop-change钩子,如何创建它?
我想在资源库浏览器中编辑日志注释,并收到一条错误消息,指出该资源库不存在pre-revprop-change挂钩。除了具有可怕的名称之外,什么是pre-revprop-change钩子,如何创建它?
Answers:
基本上,它是在修改存储库中未版本控制的属性之前启动的脚本,以便您可以更精确地管理存储库中发生的事情。
SVN发行版中的/ hooks子目录中有用于不同钩子的模板(* .tmpl,必须根据您的OS进行编辑和重命名才能激活)。
svnsync
镜像钩子,则将需要更改默认脚本,因为它仅允许更改svn:log。svnsync所做的更改远不止于此,因此我只是exit 0
在其中放置一个以允许所有属性更改(因为这仅是我的一面镜子)。
pre-revprop-change
到同一目录,并使其对Web服务器用户可执行(在Linux上)。
对于Windows,这是一个示例批处理文件的链接,该文件仅允许更改日志消息(不允许其他属性):
http://ayria.livejournal.com/33438.html
基本上,将以下代码复制到一个文本文件中并命名,pre-revprop-change.bat
然后将其保存在\hooks
存储库的子目录中。
@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5
:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" goto ERROR_PROPNAME
:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION
:: Make sure that the new svn:log message is not empty.
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
set bIsEmpty=false
)
if "%bIsEmpty%" == "true" goto ERROR_EMPTY
goto :eof
:ERROR_EMPTY
echo Empty svn:log messages are not allowed. >&2
goto ERROR_EXIT
:ERROR_PROPNAME
echo Only changes to svn:log messages are allowed. >&2
goto ERROR_EXIT
:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT
:ERROR_EXIT
exit /b 1
对于Linux,允许发布日志注释,
pre-revprop-change.tmpl
在hooks
存储库目录中找到文件pre-revprop-change
www-data
)编辑:(感谢林德斯)
0
要允许的编辑类型的退出值。这是带有许多常见钩子的堆栈溢出问题的链接,这些钩子是Subversion Hooks的Common Types,包括在pre-revprop-change
此处交叉发布的Windows钩子的原始来源。
您应该参考那里,因为随着时间的推移它们可能会有所改善。
如果您可以对钩子脚本的名称进行解密,那么它的名称就不会太吓人:它是预修订版属性更改钩子。简而言之,pre-revprop-change
钩子脚本是控制未版本化(修订)属性的更改并发送通知(例如,当修订属性更改时发送电子邮件)。
Subversion有两种类型的属性:
svn:needs-lock
和svn:mime-type
可以在文件和目录上设置的),svn:log
和svn:date
)。版本化属性具有历史记录,并且可以由对存储库具有读/写访问权限的普通用户操纵。另一方面,未版本控制的属性没有任何历史记录,并且主要用于维护目的。例如,如果您提交修订,它会立即svn:date
以您的UTC时间,您svn:author
的用户名和svn:log
您的提交日志消息(如果指定了任何内容)获得。
正如我已经指定的那样,pre-revprop-change
钩子脚本的目的是控制修订版属性的更改。您不希望有权访问存储库的每个人都能够修改所有修订版属性,因此默认情况下禁止更改修订版属性。要允许用户更改属性,您必须创建pre-revprop-change
挂钩。
最简单的钩子只能包含一行:exit 0
。它将允许任何经过身份验证的用户更改任何修订版属性,并且不应在实际环境中使用它。在Windows上,可以使用批处理脚本或基于PowerShell的脚本在pre-revprop-change
挂钩中实现某些逻辑。
此PowerShell脚本svn:log
仅允许更改属性,并且拒绝空日志消息。
# Store hook arguments into variables with mnemonic names
$repos = $args[0]
$rev = $args[1]
$user = $args[2]
$propname = $args[3]
$action = $args[4]
# Only allow changes to svn:log. The author, date and other revision
# properties cannot be changed
if ($propname -ne "svn:log")
{
[Console]::Error.WriteLine("Only changes to 'svn:log' revision properties are allowed.")
exit 1
}
# Only allow modifications to svn:log (no addition/overwrite or deletion)
if ($action -ne "M")
{
[Console]::Error.WriteLine("Only modifications to 'svn:log' revision properties are allowed.")
exit 2
}
# Read from the standard input while the first non-white-space characters
$datalines = ($input | where {$_.trim() -ne ""})
if ($datalines.length -lt 25)
{
# Log message is empty. Show the error.
[Console]::Error.WriteLine("Empty 'svn:log' properties are not allowed.")
exit 3
}
exit 0
此批处理脚本仅允许“ svnmgr”用户更改修订版属性:
IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )
exit 1
goto :eof
:label1
exit 0