You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SVN预提交钩子中获取事务提交者失败:提示无此事务如何解决?

问题原因分析及解决办法

最常见的问题是参数顺序搞反了,这也是新手写SVN钩子最容易踩的坑。

SVN的pre-commit钩子脚本触发时,会自动传入两个固定参数:

  1. 第一个参数是仓库的绝对路径
  2. 第二个参数是事务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-datasvn)需要对仓库目录有读权限,否则svnlook无法读取仓库内容。
  • 参数有效性:可以在脚本中临时添加一行echo "Transaction ID: $TRANSACTION" >> /tmp/svn_test.log,验证传入的事务ID是否正确。

内容的提问来源于stack exchange,提问作者Dame Lyngdoh

火山引擎 最新活动