我想在存储库浏览器中编辑日志注释并收到一条错误消息,指出存储库不存在 pre-revprop-change 挂钩。除了有一个可怕的名字之外,什么是 pre-revprop-change 钩子,我如何创建它?
11 回答
对于 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
基本上,它是在存储库上修改未版本化属性之前启动的脚本,因此您可以更精确地管理存储库中发生的事情。
SVN 发行版中有用于不同挂钩的模板,位于 /hooks 子目录(*.tmpl,您必须根据您的操作系统编辑和重命名才能激活)。
对于 Linux 允许编辑日志注释,
pre-revprop-change.tmpl
在hooks
您的存储库目录中找到该文件- 将文件复制到同一目录,将其重命名为
pre-revprop-change
- 授予文件执行权限(对于服务器用户,例如
www-data
)
编辑:(感谢林德斯)
- 之后,您可能必须编辑脚本以返回
0
您想要允许的编辑类型的退出值。
这是堆栈溢出问题的链接,其中包含许多常见挂钩Common Types of Subversion Hookspre-revprop-change
,包括此处交叉发布的 Windows 挂钩的原始来源。
您应该参考那里,因为它们可能会随着时间的推移而得到改善。
谢谢#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-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
hook 中实现一些逻辑。
此 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 用户:.bat 扩展名在 Windows Server 上使用时对我不起作用。我按照 Django Reinhardt 的建议使用 VisualSvn,它创建了一个带有 .cmd 扩展名的钩子。
如果要保存对日志消息的更改,请使用来自@patmortech ( https://stackoverflow.com/a/468475 )的上述答案中的批处理脚本,该脚本从https://stackoverflow.com/
复制了脚本a/68850,并在和
之间添加这些行:if "%bIsEmpty%" == "true" goto ERROR_EMPTY
goto :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%
它将log-change-history.txt
在服务器上的 repo 文件夹中创建一个文本文件,并附加每个日志更改通知。
这对我来说在 Windows Server 上是最简单的:在 VisualSVN 中,右键单击您的存储库,然后选择Properties..., 然后选择Hooks选项卡。
选择Pre-revision property change hook,单击Edit。
我需要能够更改作者 - 它经常发生在多人使用的远程计算机上,我们错误地使用其他人存储的凭据签入。
这是要粘贴的修改后的社区 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
- 转到 SVN repo 目录到子文件夹“hooks”,例如“D:\SVN\hooks\”
- 在那里创建空文件“pre-revprop-change.bat”
- 在文件中写入“exit 0”(不带“”)并保存
- 请享用 :)
(这个解决方案肯定有缺点,因为没有检查/禁止任何内容。但就我而言 - 只有我正在使用的本地仓库 - 它似乎有效。)
正如 Alois Helmer 之前回答的那样,您需要在 SVN 存储库内pre-revprop-change.tmpl
的目录中找到要允许修订评论版本的文件。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.