常见的Subversion钩子类型

42

人们使用哪些钩子脚本来管理Subversion?一般的想法很好,但代码会更好!

16个回答

72

我正在使用pre-revprop-change 钩子,它允许我在提交之后实际上返回并编辑注释和其他信息。如果提交注释中有缺失/错误的信息,则此功能非常有用。

这里发布了一个Windows NT或更高版本的pre-revprop-change.bat批处理文件。您可以随意进行更改以增强其功能。您还可以根据它生成一个post-revprop-change.cmd,将旧的snv:log备份到其他地方,或者只是将其附加到新日志中。

唯一棘手的部分是能够实际解析批处理文件中的stdin。 这是使用FIND.EXE命令完成的。

另一个问题是,我从其他用户那里收到了与在exit命令中使用/b相关的问题报告。如果错误情况下行为不良,您可能需要在特定应用程序中删除该/b

@ECHO OFF

set repos=%1
set rev=%2
set user=%3
set propname=%4
set action=%5

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow changes to svn:log. The author, date and other revision
:: properties cannot be changed
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%propname%'=='svn:log' goto ERROR_PROPNAME

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow modifications to svn:log (no addition/overwrite or deletion)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%action%'=='M' goto ERROR_ACTION

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Make sure that the new svn:log message contains some text.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
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 properties are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log revision properties 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 

2
我将所有的钩子重新分组到一个 Github 账户中,以便随着时间的推移进行改进。https://github.com/philibertperusse/subversion-hooks - Philibert Perusse
如何使编辑后的日志消息至少有一定数量的字符,例如10个字符,而不是允许任何非空日志消息? - alondono
2021年,使用Visual SVN Server 4.3.4(Subversion 1.14.1)和TortoiseSVN 1.14.1,一切正常。 - liviriniu
这个脚本有更高级的版本在这里:https://dev59.com/4HVC5IYBdhLWcg3wZwTj - Andrius R.

8

我不明白为什么这仍然是一个问题。Windows XP及以上版本,通过特定的注册表更改,可以实现大小写敏感。只是客户端工具,如TortoiseSVN不支持它。应该有一个安装程序选项,在这些客户端svn工具安装时设置此注册表。 - TamusJRoyce

5
我们使用FogBugz进行缺陷跟踪,它提供了Subversion提交脚本,允许您在检入注释中包含案例编号,然后将该缺陷与修复它的检入关联起来。但这需要设置WebSVN实例,以便您有一个基于Web的存储库查看器。

3
在我的工作场所,我们设置了一个提交后钩子(post-commit hook),用于生成RSS提要,并在各种仪表板中显示。这些提要被用于代码审阅员知道何时需要进行审阅,以及我们可以看到新员工是否提交了足够的代码。请注意,这里的HTML标签已保留。

3

我们使用它们的几个方面:

  • 与缺陷跟踪器集成(在我们这里是Trac - 一个包含“Closes #514” 的提交消息可以自动标记该错误为已关闭)
  • 与构建集成(在我们这里是buildbot - 对受监视分支的提交会触发构建)
  • 用于验证提交的 pre-commit 钩子 - 我们使用svnchecker。 它验证我们的 Python 代码是否符合PEP8正确性标准
  • 向邮件列表发送提交通知邮件
  • 运行缩进脚本

3

1

编写一个 post-commit 钩子,将仓库中的更改发送到邮件列表中。您需要在与钩子文件相同的文件夹中放置 sendmail.exe 和 sendmail.ini。

您还需要在 post-commit.cmd 旁边创建一个 post-commit.tos.txt 文件来列出邮件收件人。该文件应包含:

user1@example.com,user2@example.com,user3@example.com

这是钩子代码:
@ECHO OFF
setlocal

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Get subversion arguments
set repos=%~1
set rev=%2

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Set some variables
set tos=%repos%\hooks\%~n0.tos.txt
set reposname=%~nx1
set svnlookparam="%repos%" --revision %rev%

if not exist "%tos%" goto :END

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Prepare sendmail email file
set author=
for /f "tokens=* usebackq" %%g in (`svnlook author %svnlookparam%`) do (
  set author=%%g
)

for /f "tokens=* usebackq delims=" %%g in ("%tos%") do (
  set EmailNotificationTo=%%g
)
set SendMailFile=%~n0_%reposname%_%rev%.sm

echo To: %EmailNotificationTo% >> "%SendMailFile%"
echo From: %reposname%.svn.technologie@gsmprjct.com >> "%SendMailFile%"
echo Subject: [%reposname%] Revision %rev% - Subversion Commit Notification  >> "%SendMailFile%"

echo --- log [%author%] --- >> "%SendMailFile%"
svnlook log %svnlookparam% >> "%SendMailFile%" 2>&1
echo --- changed --- >> "%SendMailFile%"
svnlook changed %svnlookparam% --copy-info >> "%SendMailFile%" 2>&1

echo .>> "%SendMailFile%"

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Send email
type "%SendMailFile%" | "%~dp0sendmail.exe" -t

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Clean-up
if exist "%SendMailFile%" del "%SendMailFile%"


:END
endlocal

1

我正在使用提交后钩子(我认为是这个)为每个提交在Basecamp上的论坛发布消息。有两个优点:

  1. 作为首席开发人员,我每天早上都会通过来自该Basecamp论坛的RSS订阅收到提交摘要,并且可以很快地了解我的团队在做什么。

  2. 我们的Trac / SVN安装位于防火墙后面,因此这使得其他地方的高层管理人员可以窥视我们正在做什么。他们可能不理解它,但对于经理来说,大量的活动看起来像是很多活动;)

我想最终的结果与@Aviv所做的类似。

我正在寻找构建单独服务器上的最新提交的解决方案,以进行持续集成,但在那之前,我必须更改我们对数据库模式进行更改的方式。


1

这个问题在一段时间前曾在Subversion用户邮件列表上讨论过。这篇文章特别提出了一些有用的想法。


0

我在提交时忘记输入注释。 没有时间弄清楚为什么我的 pre-revprop-change 钩子不起作用。 因此,以下 svnadmin 命令对我有用,以输入提交消息: svnadmin setlog <我的存储库的文件系统路径> --bypass-hooks -r 117 junk, 其中“junk”是包含我想要成为注释的文本的文件。svn setlog help 包含更多使用信息...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接