svn:E165001:提交被预提交挂钩(退出代码255)阻止而没有输出。怎么解决这个问题?

时间:2015-11-18 19:54:15

标签: linux bash svn phabricator

我正在尝试使用Phabricator配置svn。到目前为止,除了改变之外,一切似乎都在起作用。当我尝试提交任何代码时,我收到以下错误消息:

svn: E165001: Commit blocked by pre-commit hook (exit code 255) with no output.

为了清楚起见,有问题的错误消息由svn客户端程序输出。它似乎是在遇到各种问题时从svnserve发送的,例如由于某种原因无法运行挂钩。它不必由钩子提供。

如果我删除了预提交挂钩,则提交将按预期进行。

出于测试目的,我创建了一个非常简单的钩子,如下所示:

#!/bin/sh

echo "testing" >&2
exit 1

我在使用这个钩子时也得到了相同的错误信息。在这种情况下,尝试解决一个更复杂的脚本没有多大意义,直到这个脚本可以工作。很可能通过解决这个脚本,原始脚本也可以正常工作。我一直在测试这个脚本,我在这个问题中发布的所有内容都适用于这个脚本。 基本上,在这个时间点,我提交的脚本确实是我正在努力工作的脚本。

我已经禁用了Phabricator守护进程,否则Phabricator会覆盖预提交脚本。

以下是我认为可能有助于解决此问题的一些信息,基于我迄今为止看到的有关此错误消息的内容:

  • 存储库由运行svnserve的用户phd拥有。
  • 预提交挂钩设置为可执行。
foven@phabricator:~$ sudo ls -la /var/repo/SVN/hooks/
total 60
drwxr-xr-x. 3 phd  phd   4096 Nov 18 13:46 .
drwxr-xr-x. 6 phd  phd   4096 Nov 18 11:27 ..
-rwxr-xr-x. 1 phd  phd   2062 Oct 27 10:17 post-commit.tmpl
-rwxr-xr-x. 1 phd  phd   1638 Oct 27 10:17 post-lock.tmpl
-rwxr-xr-x. 1 phd  phd   2289 Oct 27 10:17 post-revprop-change.tmpl
-rwxr-xr-x. 1 phd  phd   1567 Oct 27 10:17 post-unlock.tmpl
-rwxr-xr-x  1 phd  phd     37 Nov 18 14:39 pre-commit
drwxr-xr-x. 2 phd  phd     19 Nov 17 17:05 pre-commit-phabricator.d
-rwxr-xr-x. 1 phd  phd   3426 Nov 12 15:59 pre-commit.tmpl
-rwxr-xr-x. 1 phd  phd   2434 Oct 27 10:17 pre-lock.tmpl
-rwxr-xr-x. 1 phd  phd   2786 Oct 27 10:17 pre-revprop-change.tmpl
-rwxr-xr-x. 1 phd  phd   2122 Oct 27 10:17 pre-unlock.tmpl
-rwxr-xr-x. 1 phd  phd   3163 Oct 27 10:17 start-commit.tmpl
  • SELinux被禁用/设置为允许:
foven@phabricator:~$ sudo getenforce
Disabled
  • 我在预提交钩子文件上运行了dos2unix:
foven@phabricator:~$ sudo dos2unix /var/repo/SVN/hooks/pre-commit
dos2unix: converting file /var/repo/SVN/hooks/pre-commit to Unix format...
  • 我可以从命令行以用户phd:
  • 运行钩子脚本
[phd@phabricator ~]$ /var/repo/SVN/hooks/pre-commit
testing

即使是空的环境,这显然与svn挂钩的运行方式相匹配。

[phd@phabricator ~]$ env -i /var/repo/SVN/hooks/pre-commit
testing
  • 看起来剧本的shebang是正确的:
[phd@phabricator ~]$ which sh
/bin/sh
[phd@phabricator ~]$ ls -la /bin/sh
lrwxrwxrwx. 1 root root 4 Aug 18 09:37 /bin/sh -> bash
[phd@phabricator ~]$ which bash
/bin/bash
  • 如果挂钩被删除,我可以提交代码。
  • 我可以结帐代码。

更新

根据#svn IRC频道的讨论,我尝试了以下内容:

sudo svn mkdir file:///var/repo/SVN/TestFolder -m "Add test folder"

svn: E165001: Commit blocked by pre-commit hook (exit code 1) with output:
testing

所以这意味着钩子可以工作,可能根本没有错。仍然不确定问题是什么,所以不能完全排除钩子(可能钩子大多数都很好,但需要改变一些东西才能使用这个配置)。看来问题可能在于其他地方。欢迎任何帮助。

5 个答案:

答案 0 :(得分:2)

不知道dos2unix会做什么改变,但在我的情况下,UTF-8和LF中断都是问题所在。 我使用www-data作为文件的所有者而不是phpd用户。

我的情况是创建/编辑文件tru WinSCP和notepad ++,我使用带有CRLF中断的窗口并使用ANSI在Windows上对其进行编码。

我将文件更改为UTF-8和UNIX(LF中断),然后在编码更改后更改编码错误的部分(; amp ;; gth,例如)。

答案 1 :(得分:0)

我有这个完全相同的问题,通过查看可能导致退出代码为255(或-1)的内容,我确定在分支进程执行任何挂钩之后它尝试执行的操作之一是完全无用的“cd。”。在我的情况下,因为svnserve的调用源于另一个用户的登录,该用户随后被suv给用户svnserve应该执行,它没有权限cd到它所在的目录。因此呼叫“cd。”失败,进程退出,甚至没有尝试执行预提交挂钩。

相当模糊,因为没有迹象表明cwd与此有任何关系。

您没有说明在您的情况下如何执行svnserve,但要检查的另一件事是它运行的用户是否有权访问cwd。

答案 2 :(得分:0)

我在Centos6.5上部署了svn服务器,并在Win7上使用客户端TortoiseSVN1.8.10。当第一次添加预提交钩子脚本时,提交时会在客户端弹出消息“由提交时挂钩提交挂钩(退出代码255)而没有输出”。我刚刚通过以下行动解决了这个问题:

$ cd / data / svn / hooks /

$ chmod + x ./pre-commit

答案 3 :(得分:0)

对我来说,经过一个小时的调查,我发现我没有ksh,因为它是在预提交文件中使用的。安装后,一切顺利。

答案 4 :(得分:-2)

以下是我的错误消息:

  

aaaa @ zgg:〜/ www / eval / webroot $ svn ci -m'' index.php
  发送index.php
  传输文件数据.done
  承诺交易......
  svn:E165001:提交失败(详情如下):
  svn:E165001:提交被预提交挂钩(退出代码255)阻塞,输出:
  ************************************************** ***********************
  *在提交这些更改之前,请更正以下错误! *
  ************************************************** ***********************

我如何解决问题:

我刚刚在我要提交的文件(index.php)中发现了一些语法错误,并且在修复语法错误后我可以成功提交。

检查提交文件中是否有任何错误。 祝你好运!