SVN预提交钩子中获取事务提交者失败:提示无此事务如何解决?
问题原因分析及解决办法
最常见的问题是参数顺序搞反了,这也是新手写SVN钩子最容易踩的坑。
SVN的pre-commit钩子脚本触发时,会自动传入两个固定参数:
- 第一个参数是仓库的绝对路径
- 第二个参数是事务ID(Transaction Name)
而你使用的svnlook author命令语法要求是:
svnlook author -t [Transaction name] [Path to repository]
如果你的脚本里把参数顺序搞反了(比如把仓库路径传给了-t的位置,事务ID放在了仓库路径的位置),svnlook会把仓库路径当成事务名去查找,自然会出现"No such transaction"的错误。
正确的实现方式
下面是一个标准的pre-commit钩子示例,演示如何正确获取提交者名称并完成日志记录:
#!/bin/sh # 把钩子传入的参数赋值给变量,提升代码可读性 REPOSITORY="$1" TRANSACTION="$2" # 可选:检查参数是否合法,避免空参数导致的异常 if [ -z "$REPOSITORY" ] || [ -z "$TRANSACTION" ]; then echo "Error: Missing required parameters" >&2 exit 1 fi # 正确调用svnlook获取提交者名称 COMMIT_AUTHOR=$(svnlook author -t "$TRANSACTION" "$REPOSITORY") # 执行日志记录操作,这里以写入日志文件为例 LOG_FILE="/var/log/svn_commit_records.log" echo "$(date '+%Y-%m-%d %H:%M:%S') - Commit from: $COMMIT_AUTHOR (Transaction ID: $TRANSACTION)" >> "$LOG_FILE" # 返回0表示允许提交,返回非0则会阻止本次提交 exit 0
其他可能的排查点
如果按上述方法仍报错,可以检查以下几点:
- 脚本权限:确保
pre-commit脚本有可执行权限,在仓库的hooks目录下执行chmod +x pre-commit。 - svnlook路径:如果服务器上的
svnlook不在系统默认PATH中,需要使用绝对路径调用(可以用which svnlook命令查找路径,比如/usr/bin/svnlook)。 - 用户权限:运行钩子脚本的用户(通常是SVN服务进程的用户,比如
www-data或svn)需要对仓库目录有读权限,否则svnlook无法读取仓库内容。 - 参数有效性:可以在脚本中临时添加一行
echo "Transaction ID: $TRANSACTION" >> /tmp/svn_test.log,验证传入的事务ID是否正确。
内容的提问来源于stack exchange,提问作者Dame Lyngdoh




