在 SVN 中,什么是 pre-Revprom-change 挂钩,以及如何创建它?

我希望在存储库浏览器中编辑一条日志注释,然后收到一条错误消息,表明存储库不存在任何预修复支持更改挂钩。除了拥有一个可怕的名字,什么是一个预修复改变挂钩,以及我如何创建它?

114819 次浏览

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

SVN 发行版中有针对不同钩子的模板,位于/hooks 子目录(* 。要激活 tmpl,必须根据操作系统编辑和重命名它)。

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

这里是链接到堆栈溢出问题与许多常见的钩子 颠覆钩子的常见类型,包括原来的来源的 pre-revprop-change钩子为 Windows 交叉张贴在这里。

您应该参考那里,因为它们可能会随着时间的推移而得到改进。

个人电脑用户: 那个。Bat 扩展在使用 WindowsServermach 时对我不起作用。我按照 Django Reinhardt 的建议使用 VisualSvn,它创建了一个带有。Cmd 扩展。

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

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

Subversion 中有两种类型的属性:

  • 可以在文件和目录上设置的版本属性(例如 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

为了让 Linux 允许日志注释的版本,

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

编辑: (感谢林德斯)

  • 之后,您可能必须编辑脚本以返回 0的退出值,以便进行您希望允许的编辑。
  1. 到 SVN repo 目录中的子文件夹“ hooks”,例如“ D: SVN hooks”
  2. 在那里创建空文件“ pre-revprom-change.bat”
  3. 在文件中写入“ exit 0”(没有“”)并保存它
  4. 享受:)

(这个解决方案肯定有缺点,因为没有任何检查/禁止。但就我而言——一个只有我使用的本地回购协议——似乎奏效了。)

这对我来说是 Windows 服务器上最简单的: 在 VisualSVN 中右键单击存储库,然后选择 地产..。,然后选择 钩子选项卡。

选择 预修订属性更改钩子,单击 剪辑

我需要能够改变作者-它经常发生在远程计算机使用的多个人,我们错误地签入使用别人的存储凭证。

下面是要粘贴的修改过的社区 wiki 脚本:

@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 author to be changed, but not message ("svn:log"), etc.
if /I not "%propertyName%" == "svn:author" 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:author messages are not allowed. >&2
goto ERROR_EXIT


:ERROR_PROPNAME
echo Only changes to svn:author messages are allowed. >&2
goto ERROR_EXIT


:ERROR_ACTION
echo Only modifications to svn:author revision properties are allowed. >&2
goto ERROR_EXIT


:ERROR_EXIT
exit /b 1

如果希望保存日志消息上的更改,请使用上面@patmortech (https://stackoverflow.com/a/468475)中的批处理脚本,
他从 https://stackoverflow.com/a/68850复制了剧本,
if "%bIsEmpty%" == "true" goto ERROR_EMPTYgoto :eofbefore之间加上这些线:

set outputFile=%repos%\log-change-history.txt


echo User '%user%' changes log message in rev %rev% on %date% %time%.>>%outputFile%
echo ----- Old message: ----->>%outputFile%
svnlook propget --revprop %repos% svn:log -r %rev% >>%outputFile%
echo.>>%outputFile%
echo ----- New message: ----->>%outputFile%
for /f "tokens=*" %%g in ('find /V ""') do (echo %%g >>%outputFile%)
echo ---------->>%outputFile%
echo.>>%outputFile%

它将在服务器上的 repo 文件夹中创建一个文本文件 log-change-history.txt,并附加每个日志更改通知。

正如 Alois Helmer 之前所回答的,您需要将文件 pre-revprop-change.tmpl定位在 SVN 存储库中的 hooks目录中,以便允许修订注释版本。

对我来说,使用 pre-revprop-change name创建一个副本就足够了,尽管您可以编辑它,以便只允许某些用户修改注释或其他需求。

然后必须使用 chmod 755 pre-revprop-change授予常规读取和执行权限

但是 常规执行权限是不够的。你需要像这样的 在 SELinux 中为该脚本授予 Apache/HTTPD 执行权限

chcon -t httpd_exec_t pre-revprop-change

如果您不这样做,您将得到以下错误,这些错误提供的信息很少,而且很难与 SELinux conf 相关联。

svnrdump: E175008: Revprop change blocked by pre-revprop-change hook (exit code 255) with no output.