Svn pre commit hook禁止非根目录上的Svn:mergeinfo

Svn pre commit hook禁止非根目录上的Svn:mergeinfo,svn,pre-commit-hook,mergeinfo,Svn,Pre Commit Hook,Mergeinfo,我想使用一个预提交钩子,防止开发人员在非根目录上设置svn:mergeinfo。也就是说,我希望强制svn:mergeinfo只能在“trunk”或“branchName/branchName”等目录上设置。开发人员有时需要“提醒”使用根目录的子目录作为合并目标不是一个好的做法(根据列出的最佳做法)。有没有人有这样的钩子脚本,或者知道我在哪里可以找到?我在windows环境中,所以批处理或powershell更可取,但任何东西都肯定会有帮助。首先,我建议使用perl或python来完成任务,wi

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

首先,我建议使用perl或python来完成任务,windows批处理还有很多需要改进的地方

您可以从开始使用一些示例脚本。例如,verify-po.py脚本检查文件编码,commit-access-control.pl.in检查作者是否具有提交权限。您可能会在脚本中使用svnlook diff来获取目录的更改属性,并遍历相应的路径,无论它们是使用正则表达式的分支还是标记

更新

找到了你想要的东西

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


它包含多个方法和其中的验证属性行添加(),因为它是为文件中添加到属性的每一行调用的。

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

如果不是(基于):

REPOS=“$1”
TXN=“$2”
SVNLOOK=/usr/bin/SVNLOOK
如果!($SVNLOOK log-t“$TXN”“$REPOS”| grep-q'\[override]';)然后
#获取已更改的路径列表
TXN_路径=$($SVNLOOK已更改-t“$TXN”“$REPOS”)
#筛选那些允许的:/trunk、/branchs/*、,。。。
TXN_路径=$(echo“$TXN_路径”| grep-Ev”^……(主干/分支/[^/]+/)$)
#迭代所有不允许包含mergeinfo的路径
而IFS=读取-r TXN_路径;做
元素路径=$(回显“$TXN_路径”|切割-c 5-)
MERGEINFO=$($SVNLOOK propget“$REPOS”svn:MERGEINFO-t“$TXN”“$ELEM_PATH”2>/dev/null)
如果[!“$MERGEINFO”=”;然后
echo“无法合并到不是主干或分支的目录:”>&2;
echo“$ELEM_PATH”>&2;
回显“使用[Override]进行覆盖”。>&2;
出口1;
fi

完全出于好奇-您使用的是Subversion 1.5还是1.6?(我也曾在svn的手上受苦:由于与非根目录的合并,在各种目录/文件上合并信息,但在1.5上)我们在1.6上。我遇到的问题并不是由于旧的1.5错误造成的,svn客户机在其中设置了所有可见的合并信息。相反,问题是由于“用户错误”,用户使用非根目录(如“trunk/mySubProject”)作为合并目标执行合并,因此在该目录上设置合并信息。我相信你也知道,这会破坏后续的合并。的确,谢谢你提供的信息。我们最近才上了1.6,所以我还没有时间观察事情是如何变化的。不过,我需要解决同样的问题+FavoriteOh,这似乎很有帮助…@StuartLange:它并没有真正搞砸后续的合并,因为SVN考虑了这些信息。真正困难的是当你作为一个人类想要知道什么已经被合并或没有。看起来这将是最有可能的解决方案,因此是赏金赢家,除非其他人能想出什么。顺便说一下,在你的问题之后,我开始对svn挂钩感兴趣,我将实施一些(从禁止没有日志消息的提交开始),并可能在提交时到达检查属性-然后将在此处放置另一个更新。
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