【发布时间】: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