SVN提交前钩子禁止在非根目录上使用svn:mergeinfo属性

19

我想使用一个 pre-commit 钩子来防止开发人员在非根目录上设置 svn:mergeinfo。也就是说,我希望强制要求只有像 "trunk" 或 "branches/branchName" 这样的目录才能设置 svn:mergeinfo。有时候需要“提醒”开发人员不要将根目录的子目录用作合并目标(根据这里列出的最佳实践)。请问是否有这样的钩子脚本或者知道哪里可以找到?我在 Windows 环境中,因此批处理或 Powershell 更好,但任何东西都肯定会有所帮助。


纯好奇 - 你使用的是Subversion 1.5还是1.6?(我也曾因合并到/从非根目录而在各种目录/文件上遭受svn:mergeinfos的折磨,但在1.5上) - Joshua McKinnon
1
我们现在使用的是1.6版本。我遇到的问题不是由于旧版本1.5中svn客户端在所有可见的地方设置合并信息的错误。相反,这些问题是由“用户错误”引起的,即用户使用非根目录(例如“trunk/mySubProject”)作为合并目标来执行合并,从而在该目录上设置合并信息。这会破坏后续的合并过程,相信您已经意识到了。 - Stuart Lange
确实 - 感谢提供信息。我们最近才开始使用1.6版本,所以我还没有时间观察事物的变化。不过我也需要解决同样的问题。+收藏 - Joshua McKinnon
哦,这似乎会非常有帮助... - Charles
@StuartLange:这并不会真正影响后续的合并,因为SVN会考虑到这些信息。真正困难的是当你作为一个人想要弄清楚已经合并了什么或者没有合并的时候。 - Christopher Oezbek
2个回答

7
首先,我建议使用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来查看事务的进度。在筛选事务时,它调用一组钩子,允许存储库管理员检查正在进行的操作并决定是否接受。

它包含几种方法,其中之一是verify_property_line_added()。因为它是对每个添加到文件属性上的行都进行调用

看起来这将是最有可能的解决方案,因此是赏金获得者,除非其他人能想出更好的东西。 - Charles
顺便说一下,在你的问题之后,我开始对svn钩子感兴趣,并且打算实现一些功能(从禁止没有日志消息的提交开始),可能会在提交时检查属性 - 然后会在这里发布另一个更新。 - pmod

1
如果您可以在服务器上使用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

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