【问题标题】:Common Types of Subversion HooksSubversion Hooks 的常见类型
【发布时间】:2010-09-05 14:09:58
【问题描述】:

人们在 Subversion 中使用哪些类型的钩子脚本?只是一般的想法,但代码也会很棒!

【问题讨论】:

    标签: svn version-control scripting svn-hooks


    【解决方案1】:

    我正在使用pre-revprop-change 钩子,它允许我在执行提交后实际返回并编辑 cmets 和此类信息。如果提交 cmets 中存在缺失/错误信息,这将非常有用。

    我在这里发布了一个pre-revprop-change.bat Windows NT 或更高版本的批处理文件。你 当然可以通过更多的修改来增强它。您还可以导出一个 post-revprop-change.cmd 从中备份旧的 snv:log 某处或只是将其附加到新日志。

    唯一棘手的部分是能够真正解析标准输入 批处理文件。这是通过FIND.EXE 命令在此处完成的。

    另一件事是,我收到了其他用户关于使用/bexit 命令的问题的报告。如果错误情况表现不佳,您可能只需要在您的特定应用程序中删除该 /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 
    

    【讨论】:

    • 我实际上将我所有的钩子重新组合到一个 github 帐户中,以便它可以随着时间的推移而改进github.com/philibertperusse/subversion-hooks
    • 不允许任何非空日志消息,如何做到这一点,以便编辑后的日志消息至少有多个字符,例如10 个字符?
    • 2021 并且它有效 - 使用:Visual SVN Server 4.3.4 (Subversion 1.14.1); TortoiseSVN 1.14.1 .
    【解决方案2】:

    如果您有混合使用该存储库的 unix 和 Windows 用户,我强烈建议您使用 case-insensitive.py 预提交挂钩脚本作为预防措施。它可以防止 svn updates fail for Windows users because of a file rename which only changed the case of the file name 难以解决的情况。相信我,它很有可能会为您省去麻烦。

    【讨论】:

    • 我不明白为什么这仍然是一个问题。 Windows XP 及更高版本,具有特定的注册表更改,可以区分大小写。只是客户端实用程序,例如 TortoiseSVN 不支持它。应该是安装这些客户端 svn 实用程序时设置此寄存器的安装程序选项。
    【解决方案3】:

    我们使用FogBugz 进行错误跟踪,它提供了颠覆提交脚本,允许您在 cmets 中包含一个案例编号,然后将错误与修复它的检查相关联。它确实需要设置一个 WebSVN 实例,以便为您的存储库提供一个基于 Web 的查看器。

    【讨论】:

      【解决方案4】:

      在我的工作场所,我们设置了一个提交后挂钩,它生成 RSS 提要,这些提要显示在各种仪表板中,并用于代码审查人员了解何时需要审查并让我们看到新员工承诺足够了。

      【讨论】:

        【解决方案5】:

        我们用它们做的几件事:

        • 与错误跟踪器集成(Trac in our case - 一条显示“关闭 #514”的提交消息会自动将该错误标记为已关闭
        • 与构建集成集成(buildbot in our case - 提交到被监视的分支会触发构建
        • 用于验证提交的预提交钩子 - 我们使用svnchecker。它验证了PEP8 correctness 的 Python 代码
        • 将签到邮件发送到邮件列表
        • 运行缩进脚本

        【讨论】:

          【解决方案6】:

          对于那些正在为 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
          

          它来自这里:http://chestofbooks.com/computers/revision-control/subversion-svn/Repository-Replication-Reposadmin-Maint-Replication.html,并已针对 Windows 进行了调整。

          【讨论】:

            【解决方案7】:

            我正在使用提交后挂钩 (I think it's this one) 为每个提交在 Basecamp 的论坛上发布消息。两大优势:

            1. 作为首席开发人员,我每天早上都会收到一份提交汇总(通过该 basecamp 论坛的 RSS 提要),并且可以很快看到我的团队在做什么。

              李>
            2. 我们的 Trac/SVN 安装在我们的防火墙后面,因此这让我在其他位置的上级可以了解我们正在做什么。他们可能不理解,但对于经理来说,很多活动看起来就像是很多活动;)

            我猜这最终的结果类似于 @Aviv 正在做的事情。

            我正在寻找在单独的服务器上构建最新提交以进行持续集成的解决方案,但我将不得不改变我们对数据库架构进行更改的方式,然后才能生效。

            【讨论】:

              【解决方案8】:

              这是不久前在颠覆用户邮件列表中讨论过的。 This 的帖子特别有一些有用的想法。

              【讨论】:

                【解决方案9】:

                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
                

                【讨论】:

                  【解决方案10】:

                  我认为最常见的一种是允许人们在提交后更改修订版 cmets。

                  您需要启用 'pre-revprop-change' 挂钩脚本以允许这样做。提供的示例,如果启用,则仅允许编辑评论属性并且只能是原始提交者。非常适合纠正错别字。

                  【讨论】:

                    【解决方案11】:

                    通知错误/问题管理系统存储库更改的挂钩。 IE。提交消息中包含 issue:546 或类似标签,已解析并提供给错误管理系统。

                    【讨论】:

                      【解决方案12】:

                      我们使用钩子脚本检查以下内容:

                      • 已提供提交日志消息
                      • 已为提交指定了审阅者
                      • 存储库中没有自动生成的代码或禁止的文件类型
                      • 创建分支/标签时发送电子邮件

                      我们仍然想实现以下内容:

                      • 当用户获得文件锁定时发送电子邮件
                      • 当您的锁被盗时发送电子邮件
                      • 在修订属性发生更改时向所有人发送电子邮件

                      【讨论】:

                        【解决方案13】:

                        我们使用提交挂钩脚本来触发我们的发布机器人。在我们不同的产品中将新的发布信息写入名为 changes.txt 的文件将触发标签和相关工件的创建。

                        【讨论】:

                          【解决方案14】:

                          我有一个使用 Ruby Tinder 库的设置,我发送到篝火室,如果有人想要脚本,我可以发布或将代码发送给你。

                          我见过的其他常见问题是错误跟踪系统和电子邮件通知的帖子。

                          【讨论】:

                            【解决方案15】:

                            Windows 预提交挂钩以检查日志是否包含某些内容。

                            @ECHO OFF
                            setlocal
                            
                            :::::::::::::::::::::::::::::::::::::::::::::::::::::::::
                            :: Get subversion arguments
                            set repos=%~1
                            set txn=%2
                            
                            :::::::::::::::::::::::::::::::::::::::::::::::::::::::::
                            :: Set some variables
                            set svnlookparam="%repos%" -t %txn%
                            
                            ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
                            :: Make sure that the new svn:log message contains some text.
                            set bIsEmpty=true
                            for /f "tokens=* usebackq" %%g in (`svnlook log %svnlookparam%`) do (
                               set bIsEmpty=false
                            )
                            if '%bIsEmpty%'=='true' goto ERROR_EMPTY
                            
                            echo Allowed. >&2
                            
                            goto :END
                            
                            
                            :ERROR_EMPTY
                            echo Empty log messages are not allowed. >&2
                            goto ERROR_EXIT
                            
                            :ERROR_EXIT
                            :: You may require to remove the /b below if your hook is called directly by subversion
                            exit /b 1
                            
                            :END
                            endlocal
                            

                            【讨论】:

                              【解决方案16】:

                              我在提交时忘记输入评论。没有时间弄清楚为什么我的 pre-revprop-change 挂钩不起作用。所以下面的 svnadmin 命令可以帮助我输入提交信息: svnadmin setlog <filesystem path to my repository> --bypass-hooks -r 117 junk, 其中“垃圾”是包含我想成为评论的文本的文件。 svn setlog help 有更多使用信息...

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 2012-08-27
                                • 2012-09-19
                                • 2012-01-07
                                • 2019-11-07
                                • 1970-01-01
                                • 2017-05-03
                                • 2016-10-08
                                相关资源
                                最近更新 更多