代码之家  ›  专栏  ›  技术社区  ›  Manu JCasso

什么是SVN中的pre-revprop change hook,如何创建它?

  •  162
  • Manu JCasso  · 技术社区  · 16 年前

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

    7 回复  |  直到 8 年前
        1
  •  51
  •   bahrep Ahamed    10 年前

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

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

        2
  •  204
  •   community wiki 4 revs, 3 users 90% patmortech    14 年前

    对于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
    
        3
  •  11
  •   Community CDub    8 年前

    下面是用许多常见的钩子指向堆栈溢出问题的链接 Common Types of Subversion Hooks ,包括 pre-revprop-change 窗钩在这里交叉张贴。

    你应该参考那里,因为它们可能会随着时间而改进。

        4
  •  11
  •   Alois Heimer    9 年前

    对于Linux,允许编辑日志注释,

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

    编辑: (多亏了林德)

    • 之后,您可能需要编辑脚本以返回退出值 0 对于您希望允许的编辑类型。
        5
  •  6
  •   yasin    12 年前

    谢谢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
    
        6
  •  4
  •   bahrep Ahamed    8 年前

    钩子脚本的名字并不可怕,如果你能破解它:它是 预修订属性更改挂钩 . 简而言之,目的在于 pre-revprop-change hook脚本用于控制未版本化(修订)属性的更改,并发送通知(例如,在修订属性更改时发送电子邮件)。

    Subversion中有两种类型的属性:

    • 版本化属性(例如 svn:needs-lock svn:mime-type )可以在文件和目录上设置,
    • 未版本化(修订)属性(例如 svn:log svn:date )在存储库中设置的 修订 .

    版本化属性具有历史记录,可以由具有存储库读/写权限的普通用户操作。另一方面,未版本化的属性没有任何历史记录,主要用于维护目的。例如,如果提交一个修订,它会立即 日期: 在您提交的UTC时间内, svn:author 使用您的用户名和 登录日志 使用提交日志消息(如果指定了任何日志消息)。

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

    最简单的钩子只能包含一行: exit 0 . 它将允许任何经过身份验证的用户更改任何修订属性,并且不应在真实环境中使用。在Windows上,可以使用批处理脚本或基于PowerShell的脚本在 转速前转速变化 钩子。

    此PowerShell脚本允许更改 登录日志 属性,并拒绝空日志消息。

    # 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
    
        7
  •  2
  •   noti    12 年前

    个人电脑用户: 在Windows Server计算机上使用时,.bat扩展不适用于我。我按照DjangoReinhardt的建议使用了VisualSVN,它创建了一个扩展名为.cmd的钩子。