35

我得到错误:

remote: error: cannot run hooks/post-receive: No such file or directory

尝试推送到远程时。post-receivce 文件存在于正确的位置 (testnew.git/hooks) 并包含:

#!/bin/bash2
export GIT_DIR=/var/www/testnew/testnew/.git/
export GIT_WORK_TREE=/var/www/testnew/testnew/
cd /var/www/testnew/testnew/

echo "here we go..."
git fetch
git merge origin/master
git submodule update --init --recursive

我尝试使用以下方法设置接收后权限:

chmod a+x post-receive

但这给出了同样的错误。将权限设置为 755 会消除错误,但脚本不会运行。

4

5 回答 5

37

如果hooks/post-receive文件存在,标记为可执行,但无法执行,则会发生这种情况。它无法执行,因为解释器/bin/bash2, 要么不存在,要么不可执行。

将 bash替换为/bin/bash2确实存在且在服务器上可执行的名称。

(错误看起来像这样的原因是,操作系统只返回错误状态“没有这样的文件或目录”,但不报告哪个文件不存在。并且试图执行它的代码不知道系统已经读取hooks/post-receive并正在寻找/bin/bash2。它所知道的只是它试图运行hooks/post-receive,所以这就是它打印的内容)。

于 2012-07-24T12:39:32.277 回答
19

此外(供将来参考和有关此问题的文档)如果您要echo $SHELL在 shell 中运行,您应该会看到预期的结果,在这种情况下(基于批准的答案),您会期望得到/bin/bash结果。但另一个可能的问题是看不见的回车

hooks/post-receive如果您仍然遇到问题,请尝试运行,您可能会得到如下响应:

-bash: hooks/post-receive: /bin/bash^M: bad interpreter: No such file or directory

这里的关键^M证明你实际上得到了一个意外的回车,否则如果它起作用了,你可能会得到一个挂起的响应。

解决这个问题,它应该可以解决您的问题。这样做的方法是使用dos2unix,例如:

dos2unix .htaccess
于 2014-11-05T21:43:36.493 回答
1

检查您是否拥有正确的 775 权限。

对我来说,它通过重做文件夹结构来工作

git init --bare
于 2021-01-09T20:27:03.083 回答
0

这是我忘记先做造成的git init

于 2016-11-01T07:47:47.210 回答
0

虽然这个问题是几年前提出的,但我觉得我可以为未来的读者添加我的解决方案。在我自己的情况下,以下步骤解决了它:

  • 我确信我已经完成了git init --bare
  • 从我的 bash 控制台,我跑了which bash,然后我看到这就#!/bin/bash足够了
  • 从 bash 控制台,完全知道我在我的裸仓库应用程序文件夹中(相当于~/bare-repos/mysite.git,我跑去hooks/post-receive看看这是否正常工作。在我自己的情况下,我得到了bash: hooks/post-receive: /bin/bash^M: bad interpreter: No such file or directory
  • 然后,我知道我遇到了意外的回车,但我不想dos2unix在pythonanywhere中使用。
  • 我在 pythonanywhere 的编辑器中打开了 post-receive 文件,清除了所有行,然后手动键入了行,而不是复制和粘贴行。
  • 再次,从 bash 控制台,完全知道我在我的裸 repo 应用程序文件夹中(相当于~/bare-repos/mysite.git,我运行 hooks/post-receive 以查看这是否正常工作。在我自己的情况下,没有抛出错误。
  • 我很高兴去。
于 2020-01-19T00:29:48.667 回答