这是我的钩子脚本,它应该限制cpp文件的提交而没有注释。但是它无法执行......任何想法
#!/bin/bash
REPOS="$1"
TXN="$2"
SVNLOOK="/usr/bin/svnlook"
AWK="/usr/bin/awk"
GREP="/bin/egrep"
SED="/bin/sed"
CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A|M]" | $AWK '{print
$2}' | $GREP \\.cpp$`
for FILE in $CHANGED
do
MESSAGE=`$SVNLOOK log -t "$TXN" "$REPOS" "$FILE" | sed 's/ *//g' |$GREP ".\
{16,\}"`
if [ $? -ne 0 ]
then
echo 1>&2
echo "***********************************" 1>&2
echo `echo "$MESSAGE"` 1>&2
echo "***********************************" 1>&2
exit 1
fi
done
答案 0 :(得分:0)
确保预提交脚本具有执行权限(chmod +x pre-commit
)
此外,请确保脚本确实正在执行但您没有意识到它是。请注意,只有在出现错误并且您使用非零错误代码退出时,回显消息才会回显给客户端。
答案 1 :(得分:0)
首先:
svn:log
来查找提交消息。您不必查看该消息。尝试这个完全未经测试的重写:
#!/bin/bash
REPOS="$1"
TXN="$2"
SVNLOOK="/usr/bin/svnlook"
AWK="/usr/bin/awk"
GREP="/bin/egrep"
SED="/bin/sed"
if "$SVNLOOK" changed -t $TXN | grep -q "^ *[UAM].*\.cpp$"
then
MESSAGE=$("$SVNLOOK" pget -t $TXN --revprop "$REPOS" svn:log)
if [ -z ${MESSAGE:16} ]
then
echo "Committing a *.cpp file, but didn't put a comment!" >&2
exit 1 #CPP, but message too short
else
exit 0 #CPP Files but message is long enough
fi
exit 0 #No CPP files
以下是一些变化:
你有这个:
CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A|M]" | $AWK '{print $2}' | $GREP \\.cpp$`
你通过一个grep,一个awk,然后通过另一个grep推送它。相反,为什么不立刻做整行呢?
"$SVNLOOK" changed -t $TXN "$REPOS" | $GREP -q "^ *[UAM].*\.cpp$"
[UAM]
表示U
或M
或A
。每个之间不需要|
。 $GREP -q
意味着悄悄地做grep。如果找到了某些内容,则会返回0,否则返回1.您可以将其直接放入if
语句中而不使用[...]
测试大括号。.*\.cpp$
表示我正在查看该行的其余部分,看看它是否以.\.cpp
结尾,不需要grep|awk|grep
管道。$(...)
而不是后退。它做同样的事情,但更容易看到。${MESSAGE:16}
。在BASH中,这会对我的消息进行16个字符的偏移。如果我的邮件短于16个字符,则${MESSAGE:16}
为空。然后我可以使用-z
来查看偏移字符串是否为空。保存你的管道到sed,然后grep。看看这是否有效。实际上,将它作为钩子外部的常规shell脚本运行。您可以将-t
更改为-r
并输入各种修订号。这样,您可以在将脚本作为挂钩尝试之前先验证脚本。然后,请确保将其设置为pre-commit
并将权限设置为rwxr-xr-x
。
更好的是,试试我的pre-commit hook。它经过了战斗测试,可以做得更多。它是一个Perl脚本,但它应该在大于5.8的任何Perl版本中运行,并且您的系统上可能已经安装了Perl。您可以检查svn:log的长度,但我的钩子脚本不允许您根据提交的内容指定它。但是,为什么要允许任何空白提交消息 - 无论是否提交了*.cpp
文件?