SVN提交后钩子错误255

10

我正在尝试为我在服务器上设置的一个仓库创建一个非常简单的提交后钩子。脚本如下:

REPOS="$1"
REV="$2"

cd /var/www/directory && svn update --username user --password pass

当我在SVN客户端运行提交时,我会得到以下错误:

post-commit hook failed (exit code 255) with no output.

然而,当我使用sudo bash post-commit从命令行运行我的post-commit hook时,它能够完美执行。有任何关于我做错了什么的想法吗?

4个回答

6

255 表示文件未找到,请尝试使用所有文件的绝对路径:

REPOS="$1"
REV="$2"

cd /var/www/directory && /usr/bin/svn update --username user --password pass

执行后提交挂钩的环境的PATH环境变量可能没有设置包含SVN可执行文件所在位置的路径。


1
唔...运气不好。我已经做出了这个更改,并验证svn位于/usr/bin,但仍然出现相同的错误。 - Brendon Dugan
4
请确保对钩子脚本进行chmod +x操作。我曾遇到“post-commit hook failed (exit code 255) with no output.”的问题。原因是我将post-commit.tmpl复制为post-commit,但没有将其改为可执行文件。 - Mike Odie
需要注意的另一件事是服务器ID(在我的情况下为“apache”)需要特别对该文件具有执行权限(通过所有权或组/全局访问)。我个人遇到过一个项目,其中我的预提交脚本是组可执行的,但忽略了apache不在该项目组中。由于apache已经拥有pre-commit.tmpl,因此将其移动到pre-commit,因为我不想添加world execute,也不想麻烦管理apache的组。 - David Thompson

5

好的,我已经找出了问题。这是路径问题与权限问题的结合体(正如chown所建议的那样,我将选择他的答案)。我已经写了一篇关于这个问题的博客文章(以及通常设置SVN的方法),可以在http://brennydoogles.wordpress.com找到。


1
  • 不要忘记在你的 post-commit hook 中添加 #!/bin/sh。如果你使用的是 python,请使用 #!/bin/env python
  • 确保权限为 chmod a+x post-commit
  • 确保 hook 中的命令已安装并可达。

当我在基于Ubuntu的Docker中运行SVN并使用post-commit hook进行Redmine同步时,遇到了这个问题:

curl "http://my.redmine.ip/sys/fetch_changesets?id=myproject&key=ETji9KUfs3XxLyyr6cRN"

我得到了错误信息Warning: post-commit hook failed (exit code 255) with no output
然后我进入我的Docker中,手动运行这个挂钩,并发现没有安装'curl'。
我安装了curl并成功运行了挂钩,但在提交时仍然出现相同的警告。
之后添加了#!/bin/sh,如下所示:
#!/bin/sh
curl "http://my.redmine.ip/sys/fetch_changesets?id=myproject&key=ETji9KUfs3XxLyyr6cRN"

一切都好。


是的,我忘记了 chmod+x。 - marcovtwout

1
如果svn服务器在apache下运行,并且操作系统运行SElinux,请记得给予apache运行脚本的权限,如下所示:
% chcon -t httpd_exec_t /home/svn/repos/hooks/post-commit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接