人们使用哪些钩子脚本来管理Subversion?一般的想法很好,但代码会更好!
人们使用哪些钩子脚本来管理Subversion?一般的想法很好,但代码会更好!
我正在使用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
我们使用它们的几个方面:
对于那些正在寻找用于 snvsync 操作的 pre-revprop-change.bat 文件的人:
https://gist.github.com/1679659
@ECHO OFF
set user=%3
if /I '%user%'=='syncuser' goto ERROR_REV
exit 0
:ERROR_REV echo "Only the syncuser user may change revision properties" >&2
exit 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
我正在使用提交后钩子(我认为是这个)为每个提交在Basecamp上的论坛发布消息。有两个优点:
作为首席开发人员,我每天早上都会通过来自该Basecamp论坛的RSS订阅收到提交摘要,并且可以很快地了解我的团队在做什么。
我们的Trac / SVN安装位于防火墙后面,因此这使得其他地方的高层管理人员可以窥视我们正在做什么。他们可能不理解它,但对于经理来说,大量的活动看起来像是很多活动;)
我想最终的结果与@Aviv所做的类似。
我正在寻找构建单独服务器上的最新提交的解决方案,以进行持续集成,但在那之前,我必须更改我们对数据库模式进行更改的方式。
我在提交时忘记输入注释。 没有时间弄清楚为什么我的 pre-revprop-change 钩子不起作用。 因此,以下 svnadmin 命令对我有用,以输入提交消息:
svnadmin setlog <我的存储库的文件系统路径> --bypass-hooks -r 117 junk
,
其中“junk”是包含我想要成为注释的文本的文件。svn setlog help
包含更多使用信息...