【问题标题】:svn: E165001: Commit blocked by pre-commit hook (exit code 255) with no output. How can this be solved?svn:E165001:提交被预提交挂钩(退出代码 255)阻止,没有输出。如何解决?
【发布时间】:2016-02-20 17:24:23
【问题描述】:

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

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

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

如果我删除 pre-commit 钩子,提交将按预期进行。

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

#!/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

所以这意味着钩子可以工作并且可能根本没有错。虽然仍然不确定问题是什么,所以不能完全排除钩子(可能是钩子大部分都很好,但需要改变一些东西才能让它与这个配置一起工作)。不过,问题似乎可能出在其他地方。欢迎任何帮助。

【问题讨论】:

  • 我阅读了文字墙,但我仍然不知道有问题的钩子是什么(你甚至包括了一个示例无问题的钩子......)你为什么不能只发布有问题的钩子以 255 退出的钩子?
  • 我提出的钩子也有问题。换句话说,使用这个钩子时,会出现与原始钩子完全相同的错误消息。如果这个简单的脚本不能工作,更复杂的脚本不太可能取得更大的成功。我试图消除尽可能多的潜在错误来源,同时仍然导致错误。我会尽量在我的问题中更清楚地说明这一点。
  • exit 1改成exit 0还会失败吗?请记住,对于程序退出代码0 是成功,而所有其他退出代码(通常)是某种失败。
  • 好问题。是的,如果将出口 1 更改为出口 0,它仍然会失败。我使用出口 1,因为我确实希望它失败,但我希望它失败并给出退出代码并提供正确的错误消息。设置为 0 时仍然失败,但仍然是有用的知识。
  • “我在使用这个钩子时也得到了同样的错误信息”这是不可能的,因为你退出 1,而不是 255 and exit 0(稍后)意味着“所有好的,通过”并成功提交

标签: linux bash svn phabricator


【解决方案1】:

以下是我的错误信息:

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

我如何解决问题:

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

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,通过查看可能导致退出代码为 255(或 -1)的原因,我确定它在分叉进程以执行任何挂钩后尝试执行的操作之一是完全没用的“cd .”。在我的例子中,因为对 svnserve 的调用源自另一个用户的登录,该用户随后被 sudo'd 到用户 svnserve 应该执行为,它没有权限 cd 到它所在的目录时间>。因此调用“cd”。失败并且进程退出,甚至没有尝试执行预提交挂钩。

    相当晦涩,因为没有迹象表明 cwd 与此有关。

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

    【讨论】:

    • 如果我理解正确的话,这听起来与secure.phabricator.com/T10941 相似,我还没有机会尝试,但其他人可能会感兴趣。抱歉,我没有更新我的帖子来提及它,但我不想这样做,直到我有机会自己测试它。听起来 Phabricator 团队可能已经解决了这个问题,所以希望更新能够在现在或将来修复它,如果更改尚未生效的话。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我在 Centos6.5 上部署了 svn 服务器,在 Win7 上使用客户端 TortoiseSVN1.8.10。首次添加预提交钩子脚本时,客户端在提交时弹出消息“提交被预提交钩子阻止(退出代码255)且无输出”。我刚刚通过以下操作解决了这个问题:

      $ cd /data/svn/hooks/

      $ chmod +x ./pre-commit

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-15
          • 2018-04-13
          • 1970-01-01
          相关资源
          最近更新 更多