什么是SVN的pre-revprop-change钩子,我该如何创build它?

我想在资源库浏览器中编辑一条日志注释,并收到一条错误消息,指出存储库没有pre-revprop-change钩子。 除了有一个可怕的名字,什么是pre-revprop-change钩子,我该如何创build它?

基本上它是一个脚本,在版本库修改了未版本化的属性之前启动,这样就可以更准确地pipe理存储库中正在发生的事情。

在SVN distrib中有不同的钩子模板,它们位于/ hooks子目录(* .tmpl,您必须根据您的操作系统进行编辑和重命名才能激活)。

对于Windows,下面是一个指向batch file的链接,它只允许更改日志消息(不是其他属性):

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 

下面是链接到堆栈溢出问题与许多常见的挂钩的常见types的Subversion挂钩 ,包括Windows的pre-revprop-change挂钩的原始来源交叉张贴在这里。

你应该参考一下,随着时间的推移他们可能会有所改善

感谢#patmortech

我添加了“只有同一个用户可以更改他的代码”的代码。

 :: Only allow editing of the same user. for /f "tokens=*" %%a in ( '"%VISUALSVN_SERVER%\bin\svnlook.exe" author -r %revision% %repository%') do ( set orgAuthor=%%a ) if /I not "%userName%" == "%orgAuthor%" goto ERROR_SAME_USER 

对于Linux来允许日志评论的版本,

  • 在版本库的hooks目录中findpre-revprop-change.tmpl文件
  • 将该文件复制到相同的目录,将其重命名为pre-revprop-change
  • 给文件执行权限(对于服务器用户,例如www-data

编辑:(感谢lindes)

  • 之后,您可能必须编辑该脚本,以便返回退出值为0的编辑types,您要允许。

钩子脚本的名字是不是很可怕,如果你pipe理它的解密:它是修订前的属性更改挂钩 。 简而言之, pre-revprop-change钩子脚本的目的是控制未版本化(修订版)属性的变化并发送通知(例如,在修改属性发生变化时发送电子邮件)。

Subversion有两种types的属性:

  • 版本化的属性(例如svn:needs-locksvn:mime-type )可以在文件和目录上设置,
  • 在版本库修订版上设置的未版本化(修订版)属性(例如svn:logsvn:date )。

版本化属性具有历史logging,并且可以由具有对存储库的读取/写入访问权的普通用户操纵。 另一方面,未版本控制的属性没有任何历史logging,主要用于维护目的。 例如,如果你提交了一个修订版本,它会立即得到svn:date的提交svn:datesvn:author用你的用户名和svn:log提交日志信息(如果你指定的话)。

正如我已经指定的, pre-revprop-change钩子脚本的目的是控制修订属性的更改。 您不希望每个有权访问存储库的人都能够修改所有修订版本属性,因此默认情况下禁止更改修订版本属性。 要允许用户更改属性,您必须创buildpre-revprop-change钩子。

最简单的钩子只能包含一行: exit 0 。 它将允许任何经过身份validation的用户更改任何修订版本属性,而不应在真实环境中使用。 在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 

对于PC用户:在Windows Server上使用.bat扩展名不适用于我。 我用Django Reinhardtbuild议的VisualSvn,并创build了一个扩展名为.cmd的钩子。