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


168

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


16
现在,此链接为第二个链接,
紧跟

关于潜在客户的链接指向非常过时的SVNBook 1.0。当前是1.7和1.8(每晚):svnbook.red-bean.com/en/1.8
bahrep 2013年

Answers:


52

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

SVN发行版中的/ hooks子目录中有用于不同钩子的模板(* .tmpl,必须根据您的OS进行编辑和重命名才能激活)。


2
所有说明都在挂钩模板脚本中。如果您需要svnsync镜像钩子,则将需要更改默认脚本,因为它仅允许更改svn:log。svnsync所做的更改远不止于此,因此我只是exit 0在其中放置一个以允许所有属性更改(因为这仅是我的一面镜子)。
马特·康诺利

...然后将其保存pre-revprop-change到同一目录,并使其对Web服务器用户可执行(在Linux上)。
马滕

209

对于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
可以链接到那里的版本stackoverflow.com/questions/6155/…。我写了那个钩子并将其发布在SVN论坛上。我想我应该在点子评论中说些什么。
Philibert Perusse,2009年

1
我将此脚本与VisualSVN 2.0.8和TortoiseSVN 1.6.11一起使用,效果很好。
Mark Biek 2010年

27
您可以通过在VisualSVN Server中右键单击存储库名称,然后选择“属性...”来编辑VisualSVN中的挂钩。您会看到一个“挂钩”标签。在这里,您将看到可用的不同类型的挂钩。选择正确的代码,单击“编辑”,然后将上面的代码粘贴到其中。希望对VisualSVN用户有所帮助!
Chuck Le Butt 2010年

为我工作禁用行:如果/ I不是“%action%” ==“ M”,则转到ERROR_ACTION。换句话说,它一直说只允许修改。
弥敦道

6
Windows的快速而肮脏的方法是创建一个名为hooks \ pre-revprop-change.bat的空文件
Ben Claar

18

对于Linux,允许发布日志注释,

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

编辑:(感谢林德斯)

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

这还不够...仍然需要适当地更改退出值。但无论如何,我发现它很有用,因为它可以作为寻找正确位置的指针...缺少某些其他答案,或者提供特定于Windows的答案。非常感谢。
lindes

1
我很确定,在我的Ubuntu Linux版本中,复制和授予权限就足够了。但是我不确定。我已经相应地编辑了答案。谢谢。
Alois Heimer

好吧,我确定两天前尝试并添加此评论时,它对我不起作用。但是,通过编辑,此答案对我有用。
林德斯

11

这是带有许多常见钩子的堆栈溢出问题的链接,这些钩子是Subversion Hooks的Common Types,包括在pre-revprop-change此处交叉发布的Windows钩子的原始来源。

您应该参考那里,因为随着时间的推移它们可能会有所改善。


7

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

4

如果您可以对钩子脚本的名称进行解密,那么它的名称就不会太吓人:它是预修订版属性更改钩子。简而言之,pre-revprop-change钩子脚本是控制未版本化(修订)属性的更改并发送通知(例如,当修订属性更改时发送电子邮件)。

Subversion有两种类型的属性:

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

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

2

对于PC用户:.bat扩展名不适用于Windows Server同步。我按照Django Reinhardt的建议使用VisualSvn,它创建了一个扩展名为.cmd的钩子。


0
  1. 转到SVN存储库目录,进入子文件夹“ hooks”,例如“ D:\ SVN \ hooks \”
  2. 在此处创建一个空文件“ pre-revprop-change.bat”
  3. 在文件中写入“退出0”(不带“”)并保存
  4. 请享用 :)

(此解决方案肯定有缺点,因为没有检查/禁止任何操作。但是对于我来说,这是我唯一使用的本地存储库,它似乎可以工作。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.