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

Man*_*anu 165 svn svn-hooks

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

pat*_*ech 207

对于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
Run Code Online (Sandbox Code Playgroud)

  • 可以链接到那里的版本http://stackoverflow.com/questions/6155/common-types-of-subversion-hooks/68850#68850.我写了那个钩子,不久前发布在SVN论坛上.我想我应该在钩子评论中加入一些功劳. (37认同)
  • 您可以通过在VisualSVN Server中右键单击存储库名称并选择"属性..."来编辑VisualSVN中的挂钩.你会看到一个"Hooks"标签.在那里你会看到不同类型的钩子可用.选择正确的一个,单击"编辑"并将上面的代码粘贴到其中.希望能帮助VisualSVN用户! (27认同)
  • windows的快速而脏的方法是创建一个名为hooks\pre-revprop-change.bat的空文件 (6认同)

PW.*_*PW. 51

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

SVN distrib中有不同钩子的模板,位于/ hooks子目录中(*.tmpl,你必须编辑和重命名,具体取决于你的操作系统,才能激活).

  • 所有指令都在钩子模板脚本中.如果你需要一个`svnsync`镜像的钩子,那么需要更改默认脚本,因为它只允许更改svn:log.Svnsync更改的更多,所以我只是在其中放置一个`exit 0`以允许所有属性更改(因为这只是我的镜像). (2认同)

Alo*_*mer 16

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

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

编辑:(感谢lindes)

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


Phi*_*sse 11

这里是堆栈溢出问题的链接,其中包含许多常见的钩子Subversion Hooks的常见类型,包括pre-revprop-change这里交叉发布的Windows钩子的原始来源.

你应该参考那里,因为他们可能会随着时间的推


bah*_*rep 7

如果您设法破译它,钩子脚本的名称并不那么可怕:它是预修订属性更改钩子。简而言之,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-changehook 中的一些逻辑。

此 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
Run Code Online (Sandbox Code Playgroud)

此批处理脚本仅允许“svnmgr”用户更改修订属性:

IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )

exit 1
goto :eof

:label1
exit 0
Run Code Online (Sandbox Code Playgroud)


yas*_*sin 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
Run Code Online (Sandbox Code Playgroud)