2008-10-13 122 views
157

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

+15

现在这个链接是第二个,只是在这个问题的链接:) – ULysses 2010-08-05 10:11:44

+0

关于导致非常过时的SVNBook 1.0的链接。目前的版本是1.7和1.8(每晚):http://svnbook.red-bean.com/en/1.8/ – bahrep 2013-12-05 09:04:52

回答

51

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

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

+2

所有说明都在钩子模板脚本中。如果你需要一个`svnsync`镜像钩子,那么缺省脚本将需要改变,因为它只允许修改svn:log。 Svnsync的变化不止于此,所以我只是在里面放置一个'exit 0'来允许所有的属性改变(因为这只对我来说是一面镜子)。 – 2010-12-11 21:07:50

+0

...然后将其保存为`pre-revprop-change`到相同的目录,并使其可在Web服务器用户(Linux)上执行。 – Mateng 2012-08-31 18:18:20

196

对于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 
+37

可以链接到该版本http://stackoverflow.com/questions/6155/common-types-of-subversion-hooks/68850#68850。我写了这个钩子,并在前一段时间发布在SVN论坛上。我想我应该在评论中加入一些信用。 – 2009-07-10 11:38:16

11

这里是链接到堆栈溢出问题有许多共同的挂钩Common Types of Subversion Hooks,包括pre-revprop-change挂钩的Windows这里同时张贴的原始来源。

你应该参考一下,因为他们可能会随着时间的推移而改进。

1

对于PC用户: 在Windows Server机器上使用时,.bat扩展名对我无效。我用Django Reinhardt建议的VisualSvn,它创建了一个扩展名为.cmd的钩子。

6

感谢#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 
3

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

有Subversion的2种属性:

  • 版本的特性(例如svn:needs-locksvn:mime-type),可以对文件和目录进行设置,
  • 未版本控制(修订版)的特性(例如svn:logsvn:date)这是在版本库修订版上设置的。

版本化属性具有历史记录,可以由具有对存储库的读/写访问权限的普通用户操作。另一方面,未版本控制的属性没有任何历史记录,主要用于维护目的。例如,如果您提交修订,它会立即得到您提交的UTC时间为svn:date,您的用户名为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 
6

对于Linux允许日志注释的版本,

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

编辑:(感谢lindes)

  • ,你可能需要编辑脚本的那种编辑的返回0出口值,要允许。
相关问题