SVN预提交脚本执行
这是我的钩子脚本,它应该限制提交cpp文件,没有任何注释。但是它无法执行…有什么想法吗SVN预提交脚本执行,svn,Svn,这是我的钩子脚本,它应该限制提交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
#!/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
确保预提交脚本具有执行权限(
chmod+x pre-commit
)
另外,确保脚本确实正在执行,但您没有意识到它正在执行。请注意,只有当出现错误并且您确实以非零错误代码退出时,回显消息才会回显到客户端。首先:
- 仅打印到STDERR的消息,并且仅当预提交脚本的出口不是零时才打印。否则,根本就没有打印输出
- 提交消息用于整个提交过程。这意味着您不会检查每个文件的提交消息。他们都一样
- 通过查看revision属性
,可以找到提交消息。你不必看信息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。如果您找到了某个内容,它将返回0,否则,它将返回1。您可以将其直接放入$GREP-q
语句中,而无需使用if
测试大括号[…]
表示我正在查看该行的其余部分,看它是否以*\.cpp$
结尾,不需要\.cpp
管道grep | awk | grep
- 只有一条日志消息,所以我要做的就是检查一次。不需要循环
- 注意,我使用了
而不是反勾号。它做同样的事情,但更容易看到$(…)
- 我使用
。在BASH中,这会对我的消息进行16个字符的偏移。如果我的邮件短于16个字符,则${MESSAGE:16}
为空。然后,我可以使用${message:16}
查看偏移量字符串是否为空。将管道保存到sed,然后保存到grep-z
-t
更改为-r
,并输入各种版本号。这样,您可以在将脚本作为钩子尝试之前先验证它。然后,确保这被称为预提交
,并且您的权限设置为rwxr-xr-x
更好的是,试试我的。它经过了战斗的考验,可以做得更多。这是一个Perl脚本,但它应该在任何大于5.8的Perl版本中运行,并且您的系统上可能已经有了Perl。您可以检查svn:log的长度,但是我的hook脚本不允许您根据提交的内容来指定它。但是,不管是否提交了
*.cpp
文件,您为什么要允许任何空白提交消息?它看起来像预提交挂钩(在您的问题中未提及)。它是服务器端钩子脚本吗?您为什么要在其上添加标签tortoisesvn
?您是否尝试至少记录调用本身,以便查看脚本是否被调用?是的,这是一个服务器端钩子。这将在客户端生成结果