2013-07-22 196 views

回答

12

在预先提交中使用svnlooksvnlook changed给出了提交的更改路径。将此与您的列表进行比较。如果找到/未找到路径,则拒绝它。一个预先提交的简单例子可能是。

#!/bin/sh 

REPOS="$1" 
TXN="$2" 
SPATH="specific/path" 
FOUND=$(svnlook changed -t "$TXN" "$REPOS" | tr -d '\n' | grep -E ".*$SPATH.*") 

if [ "$FOUND" != "" ] 
then 
    echo "Reject commit!" 1>&2 && exit 1 
else 
    exit 0 
fi 

在这里我删除了新行和grep感兴趣的路径。如果找不到路径,请重新提交exit 1。用户会看到你在那里回显的内容。

12

挂钩脚本应该使用svnlook命令而不是svnsvnlook命令可以使用提交的事务编号(如果这是一个预提交钩子,则需要使用事务编号,如果这是一个提交后钩子,则需要修订编号)。

做一个svnlook -h看到所有的子命令。这里是他们的列表:

  • author - 检索提交者
  • cat的用户ID - 打印出文件中指定
  • changed - 打印出来的文件和目录,改变
  • date - 打印出提交的时间戳
  • diff - 打印所有文件的差异
  • dirs-changed - 打印出修改的目录(
  • filesize - 打印出bytes`
  • history文件大小 - 打印出历史(更像svn log
  • info - 打印出文件的信息
  • lock - 打印锁定信息
  • propget - 获取特定属性。
  • proplist - 列出所有属性。
  • tree - 打印出来的目录结构
  • uuid - 打印出库
  • youngest的UUID - 打印出来的最后一个版本号。

看起来像svnlook changed是你想要的。

两个约svnlook非常重要的事情:

  1. svnlook命令不能改变任何数据,只是显示它。有些人希望看到如何使用svnlook更改房产价值。答案是,你不能。
  2. svnlook存储库目录位置作为参数,而不是存储库的URL。这意味着svnlook只能在服务器上运行。
+0

请你拿这个问题来看看http://stackoverflow.com/questions/29236308/how-to-print-arguments-in- svn-hook –

+0

答案已经给出。一个SVN钩子只会显示打印到'STDERR'而不是'STDOUT'的内容。而且,只有当hook _fails_(即以非零退出值退出)时才会发生。 –

+0

好的,所以我在我的post-commit hook中有这个命令: $ msg ='$ svnlook changed -t“$ rev”“$ repos”'; 和msg的长度为0,这意味着命令无法执行,这是在Windows上,所以这个命令是否正确,因为我没有在任何地方看到错误? –

-1

你可以尝试这样的事情:

FILTER="(some/path|other/path)" 
FOUND=$($SVNLOOK dirs-changed "$REPOS" -t "$TXN" | $GREP -E ".*/$FILTER/.*") 
if [[ "$FOUND" == "" ]]; then 
    echo "Your commit has been blocked." 1>&2 
    exit 1 
fi