我需要最基本的钩子以防止空注释签到。谷歌搜索,找到样本bash脚本。做得很短,这就是我所拥有的:
#!/bin/sh
REPOS="$1"
TXN="$2"
# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
ICONV=/usr/bin/iconv
SVNLOOKOK=1
$SVNLOOK log -t "$TXN" "$REPOS" | \
grep "[a-zA-Z0-9]" > /dev/null || SVNLOOKOK=0
if [ $SVNLOOKOK = 0 ]; then
echo "Empty log messages are not allowed. Please provide a proper log message." >&2
exit 1
fi
# Comments should have more than 5 characters
LOGMSG=$($SVNLOOK log -t "$TXN" "$REPOS" | grep [a-zA-Z0-9] | wc -c)
if [ "$LOGMSG" -lt 6 ]; then
echo -e "Please provide a meaningful comment when committing changes." 1>&2
exit 1
fi
现在我用Tortoise SVN测试它,这就是我所看到的:
提交失败(详情如下):提交被预提交挂钩阻止 (退出代码1)输出:/ home / svn / repos / apress / hooks / pre-commit: 第11行::找不到命令不允许空日志消息。 请提供正确的日志消息。此错误由a生成 Subversion服务器上的自定义钩子脚本。请联系您的 服务器管理员以获得解决此问题的帮助。
错误是什么? svnlook在/ usr / bin中 我是Linux的新手,不明白会发生什么......
答案 0 :(得分:1)
要调试脚本,您必须手动运行它。 为此,您必须获取传递给它的参数的样本值。 将脚本的开头更改为
#!/bin/sh
REPOS="$1"
TXN="$2"
echo "REPOS = $REPOS, TXN = $TXN" >/tmp/svnhookparams.txt
执行提交并检查文件/tmp/svnhookparams.txt
以获取值。
然后对脚本进行另一项更改:
#!/bin/sh
set -x
REPOS="$1"
TXN="$2"
这将启用shell运行的所有命令的回显。
现在直接从终端运行脚本,并将之前获得的值传递给它。
检查输出是否有无效命令或空变量赋值。 如果您遇到问题,请在此处发布输出。
答案 1 :(得分:1)
$PATH
为空。因此,您需要为每个外部命令指定完整路径。我的猜测是,找不到grep
。
答案 2 :(得分:0)
我正在回答我自己的问题。
这不起作用:
$SVNLOOK log -t "$TXN" "$REPOS" | \
grep "[a-zA-Z0-9]" > /dev/null || SVNLOOKOK=0
必须是1行:
$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" > /dev/null || SVNLOOKOK=0