【问题标题】:How to set a trigger to prevent commits to SVN with mergeinfo property?如何设置触发器以防止使用 mergeinfo 属性提交到 SVN?
【发布时间】:2010-01-05 09:06:42
【问题描述】:

我想avoid creating svn mergeinfo property 除了分支的根以外的任何东西。 我们有一个主干分支和一些其他分支。

假设我对 svn 触发器一无所知,我需要遵循哪些步骤来设置预提交挂钩,以防止将 mergeinfo 属性添加到除分支根以外的任何内容?

主干位于存储库的基础“/trunk”中,所有分支都在“/branches/foo”中

【问题讨论】:

    标签: svn pre-commit-hook mergeinfo


    【解决方案1】:

    基本上,您需要定义一个 SVN pre-commit 挂钩。不过,首先请阅读hooks in general

    您可能希望先将 pre-commit.tmpl 文件复制到 pre-commit,然后在其中实现逻辑。

    您可能需要检查当前执行事务的差异,例如: 补充:svn:mergeinfo

    由于有关为哪个文件添加的信息在不同的行上,因此您可能需要比 grep 更复杂的处理工具——也许是一个简单的 perl 脚本。

    当你确定一个事务有一个你不想要的附加属性时,你可以阻止提交;或者,如果你特别大胆,你可以尝试修改事务并继续。

    【讨论】:

    • FTA:警告虽然钩子脚本几乎可以做任何事情,但钩子脚本作者应该在一个方面表现出克制:不要使用钩子脚本修改提交事务。虽然使用钩子脚本自动更正提交的文件中存在的错误、缺点或违反政策可能很诱人,但这样做可能会导致问题。
    • 顺便说一句,这是一个很好的答案。澄清一下,钩子只是一个脚本。使用 svnadmin 查询 repo 或事务,并返回一个非零退出代码以拒绝提交。
    • 我同意。一般来说,不应该使用钩子来修改正在进行的提交。
    【解决方案2】:

    以下应该有效。您的存储库已经在主干上有 svn:mergeinfo,因此您永远不希望任何人再次添加。

    顺便说一下,我们的实际钩子还确保每次提交都伴随着一条日志消息,并且还可以防止通过 repo 浏览器删除我们的一些重要的顶级目录。

    @echo off
    
    set logfile=%TEMP%\%2.txt
    
    "c:\program files\subversion\svnlook" log -t %2 %1 > %logfile%
    
    for /f "tokens=1,2*" %%i in (%logfile%) do (
        if %%i==UU goto checkmergetracking
    )
    
    for /f "tokens=1,2*" %%i in (%logfile%) do (
        if %%i==_U goto checkmergetracking
    )
    
    del %logfile%
    exit 0
    
    :checkmergetracking
    "c:\program files\subversion\svnlook" diff -t %2 %1 > %logfile%
    find "Added: svn:mergeinfo" %logfile%
    if ERRORLEVEL 1 goto nomergeinfo
    
    del %logfile%
    echo "Addition of Merge Info Not Allowed" >&2
    exit 1
    
    :nomergeinfo
    del %logfile%
    exit 0
    

    【讨论】:

      猜你喜欢
      • 2011-02-17
      • 2013-04-09
      • 1970-01-01
      • 2014-08-06
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多