我最近将我们公司的 svn 存储库迁移到新服务器,大部分情况下运行良好。旧的主存储库位于 /var/svn(如直接位于 svn 目录中的 repo 文件),其他存储库设置在 /var/reponame 中,情况有点混乱。因此,当我设置新服务器时,我使用了 /srv/svn/reponame 并在旧位置创建了符号链接。到目前为止一切顺利。
svn+ssh://user@server/srv/svn/repo/
从(即真实路径)签出时一切正常,但从符号链接(svn+ssh://user@server/var/svn/[...])签出时,提交后挂钩似乎存在问题。例如,如果您使用 提交svn ci -m "refs #100"
,则应该使用提交注释更新 trac 中的票据编号 100,但除非您从实际路径签出,否则不会发生这种情况。
两种情况下的用户名相同。
我认为可能是 svnserve 没有正确遵守符号链接,因此我尝试command=/usr/bin/svnserve -r /srv/svn
在 authorized_keys 行中添加以下内容,如http://svnbook.red-bean.com/en/1.5/svn.serverconfig.svnserve.html#svn.serverconfig.svnserve.sshtricks,并从中检查svn+ssh://user@server/reponame/branches/[...]
,但结果完全相同。
提交后钩子(/srv/svn/reponame/hooks/post-commit)的内容如下(删除注释,更改名称):
REPOS="$1"
REV="$2"
LOG=`/usr/bin/svnlook log -r $REV $REPOS`
AUTHOR=`/usr/bin/svnlook author -r $REV $REPOS`
DIFF=`/usr/bin/svnlook diff -r $REV $REPOS`
TRAC_ENV='/srv/trac/sitename'
TRAC_URL='http://server.fqdn/'
/usr/share/subversion/hook-scripts/commit-email.pl "$REPOS" "$REV" user@fqdn
/usr/share/subversion/hook-scripts/code_review_request.php "$REV" "$AUTHOR" "$LOG" "$DIFF"
/usr/local/bin/trac-admin "$TRAC_ENV" changeset added "$REPOS" "$REV"
提交电子邮件和代码审查请求已发送,这意味着钩子脚本正在执行,但有人知道为什么对 trac-admin 的调用不起作用吗?
答案1
我找到了解决方案。
修复方法是改变提交后钩子,并将“REPOS”变量更改为实际路径,而不是解析命令行参数($1):
REPOS='/srv/svn/reponame'
我认为它不起作用的原因是 svn 将 repo 路径作为参数发送给钩子脚本,但 trac 不知道 /var/svn 路径 - 它只知道 /srv/svn/reponame。