svn pre-commit hook 禁止在非根目录上使用 svn:mergeinfo

Posted

技术标签:

【中文标题】svn pre-commit hook 禁止在非根目录上使用 svn:mergeinfo【英文标题】:Svn pre-commit hook to disallow svn:mergeinfo on non-root directories 【发布时间】:2011-03-19 08:30:52 【问题描述】:

我想使用一个预提交挂钩来防止开发人员在非根目录上设置 svn:mergeinfo。也就是说,我想强制 svn:mergeinfo 只能设置在“trunk”或“branches/branchName”等目录上。有时需要“提醒”开发人员,使用根目录的子目录作为合并目标不是一个好习惯(根据列出的最佳实践here)。有没有人有这样的钩子脚本或知道我在哪里可以找到一个?我在 windows 环境中,所以批处理或 powershell 会更好,但任何东西肯定会有帮助。

【问题讨论】:

非常好奇——您使用的是 Subversion 1.5 还是 1.6? (由于与非根目录的合并,我也遭受了各种目录/文件的 svn:mergeinfos 之苦,但在 1.5 上) 我们使用的是 1.6。我遇到的问题不是由于 svn 客户端在所有可见的东西上设置 mergeinfo 的旧 1.5 错误。相反,问题是由于“用户错误”,其中用户使用非根目录(如“trunk/mySubProject”)作为合并目标执行合并,因此在该目录上设置合并信息。我相信你知道这会搞砸后续的合并。 确实-感谢您提供的信息。我们最近才发布 1.6,所以我还没有时间观察事情的变化。不过,我需要解决同样的问题。 +收藏 哦,这似乎很有帮助...... @StuartLange:它并没有真正搞砸后续的合并,因为 SVN 考虑了这个信息。真正变得困难的地方是当您作为人类想要弄清楚哪些内容已被合并时。 【参考方案1】:

首先,我建议使用 perl 或 python 来完成任务,Windows 批处理还有很多不足之处。

您可以使用http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/ 中的一些示例脚本来开始。例如,verify-po.py 脚本检查文件编码,commit-access-control.pl.in 检查作者是否有提交权限。您可能会在脚本中使用 svnlook diff(如在后一个脚本中)来获取目录的更改属性并通过相应的路径,无论它们是使用正则表达式的分支还是标签。

更新

找到enforcer pre-commit hook script,这似乎就是您要找的东西。

这个脚本的作用是它使用 svnlook 查看交易 是进步。当它筛选 事务,它调用一组 允许存储库的钩子 管理员检查发生了什么 on 并决定是否 可以接受。

它包含多个方法和 verify_property_line_added(),因为它为添加到文件属性的每一行调用

【讨论】:

看起来这将是最有可能的解决方案,因此是赏金赢家,除非其他人能想出办法。 顺便说一句,在你提出问题之后,我开始对 svn 钩子感兴趣,我将实施一些(从禁止提交没有日志消息开始),并且可能会在提交时达到检查属性 -然后将在这里放另一个更新。【参考方案2】:

如果您可以在服务器上进行 CPAN:

https://github.com/gnustavo/SVN-Hooks/blob/master/examples/check-mergeinfo.pl

如果不是(基于http://comments.gmane.org/gmane.comp.version-control.subversion.user/118969):

REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook

if !($SVNLOOK log -t "$TXN" "$REPOS" | grep -q '\[override] ';) then

    # Get list of paths which have changed      
    TXN_PATHS=$($SVNLOOK changed -t "$TXN" "$REPOS")

    # Filter those which are allowed: /trunk, /branches/*,...
    TXN_PATHS=$(echo "$TXN_PATHS" | grep -Ev "^....(trunk/|branches/[^/]+/)$")

    # Iterate over all paths, which are not allowed to have mergeinfo
    while IFS= read -r TXN_PATH; do
      ELEM_PATH=$(echo "$TXN_PATH" | cut -c 5-)

      MERGEINFO=$($SVNLOOK propget "$REPOS" svn:mergeinfo -t "$TXN" "$ELEM_PATH" 2>/dev/null)
      if [ ! "$MERGEINFO" = "" ]; then 
        echo "  Cannot merge into directory that is not trunk or a branch:" >&2;
        echo "  $ELEM_PATH" >&2;
        echo "  Override by using [override]." >&2;
        exit 1;
      fi      
    done <<< "$TXN_PATHS"

    # echo "Merge info check: OK"
fi

【讨论】:

以上是关于svn pre-commit hook 禁止在非根目录上使用 svn:mergeinfo的主要内容,如果未能解决你的问题,请参考以下文章

SVN提交时报错:Commit blocked by pre-commit hook (exit code 1) with no output.

SVN禁止删除和强制注释操作的钩子脚本pre-commit (exit code 255)

Subversion - pre-commit hooks开发

如何设置SVN提交时强制添加注释

SVN_限制注释长度

SVN提交数据(Commit)失败怎么解决