我收到错误:
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会删除错误,但脚本不会运行。
答案 0 :(得分:31)
如果hooks/post-receive
文件存在,标记为可执行但无法执行,则会发生这种情况。它无法执行,因为解释器/bin/bash2
要么不存在,要么不可执行。
将/bin/bash2
替换为存在且可在服务器上执行的bash名称。
(错误看起来像这样,操作系统只返回错误状态,“没有这样的文件或目录”,但不报告哪个文件不存在。并且尝试执行它的代码确实存在不知道系统已经阅读hooks/post-receive
并且正在寻找/bin/bash2
。它只知道它是否试图运行hooks/post-receive
,这就是它打印的内容。
答案 1 :(得分:15)
此外(有关此问题的未来参考和文档)如果您在shell中运行echo $SHELL
,您应该会看到预期结果,在本例中为(基于已批准的答案)您希望/bin/bash
作为结果。但另一个可能的问题可能是看不见的回车。
如果您仍然遇到问题,请尝试运行hooks/post-receive
,您可能会收到这样的回复:
-bash: hooks/post-receive: /bin/bash^M: bad interpreter: No such file or directory
这里的关键是^M
证明您实际上是在获得意外的回车,否则如果它有效,您可能会得到一个悬而未决的回复。
修复它,它应该解决您的问题。要做到这一点,请使用dos2unix
,例如:
dos2unix .htaccess
答案 2 :(得分:1)
检查您是否拥有正确的 775 权限。
对我来说,它通过重做文件夹结构来工作
git init --bare
答案 3 :(得分:0)
这是由于我忘记先git init
造成的。
答案 4 :(得分:0)
尽管这个问题是几年前提出的,但是我觉得我可以为将来的读者添加我的解决方案。 就我自己而言,以下步骤解决了该问题:
git init --bare
which bash
,然后我发现#!/bin/bash
就足够了~/bare-repos/mysite.git
,我运行hooks/post-receive
来查看它是否运行良好。得到了bash: hooks/post-receive: /bin/bash^M: bad interpreter: No such file or directory
dos2unix
。~/bare-repos/mysite.git
,我运行了hooks / post-receive以查看是否工作正常。 ,未引发任何错误。