Subversion的预提交挂钩失败

时间:2015-04-29 02:47:28

标签: linux bash shell svn commit

我需要最基本的钩子以防止空注释签到。谷歌搜索,找到样本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的新手,不明白会发生什么......

3 个答案:

答案 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