Git-remote:错误:无法运行hooks/post-receive:没有这样的文件或目录

Git-remote:错误:无法运行hooks/post-receive:没有这样的文件或目录,git,Git,我得到一个错误: remote: error: cannot run hooks/post-receive: No such file or directory 当试图推到远程时。接收后文件位于正确的位置(testnew.git/hooks),包含: #!/bin/bash2 export GIT_DIR=/var/www/testnew/testnew/.git/ export GIT_WORK_TREE=/var/www/testnew/testnew/ cd /var/www/testn

我得到一个错误:

remote: error: cannot run hooks/post-receive: No such file or directory
当试图推到远程时。接收后文件位于正确的位置(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
我已尝试使用以下设置post接收权限:

chmod a+x post-receive
但这也会产生同样的错误。
将权限设置为755会删除错误,但脚本不会运行

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

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

(错误看起来像这样的原因是,操作系统只返回错误状态,“没有这样的文件或目录”,但不报告哪个文件不存在。试图执行该文件的代码不知道系统已经读取了
hooks/post-receive
,并且正在查找
/bin/bash2
。它只知道它试图运行
hooks/post-receive
,所以它打印的就是这个。)(供将来参考和记录此问题)如果要在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

这是因为我忘了先做git init。

虽然这个问题在几年前就被问到了,但我觉得我可以为未来的读者添加我的解决方案。 就我而言,以下步骤解决了这个问题:

  • 我确信我已经做了
    git init--bare
  • 从我的bash控制台,我运行了
    哪个bash
    ,然后我发现
    #!/bin/bash
    就足够了
  • 在bash控制台上,我清楚地知道我在我的bare repos应用程序文件夹中(相当于
    ~/bare repos/mysite.git
    ),于是我运行了
    hooks/post receive
    ,看看这是否有效。在我自己的例子中,我得到了
    bash:hooks/post receive:/bin/bash^M:bad解释器:没有这样的文件或目录
  • 然后,我知道我遇到了意外的回车,但我不想在pythonywhere中使用
    dos2unix
  • 我在pythonanywhere的编辑器中打开了post-receive文件,清除了所有行,并手动键入行,而不是复制和粘贴行
  • 再一次,在bash控制台上,我清楚地知道我在我的bare repo应用程序文件夹(相当于
    ~/bare repos/mysite.git
    )中,我运行了hooks/post receive以查看这是否工作正常。在我自己的情况下,没有抛出任何错误
  • 我很乐意去

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

对我来说,它通过使用

git init --bare

直接从shell钩子/post receive运行时会发生什么情况?我猜/bin/bash2不存在,至少它不是一个常见的解释器,/bin/bash应该足够了。这就是问题所在。切换到/bin/bash效果很好。谢谢。如果有人想知道,可以运行
哪个bash
,以找到当前可用bash的路径。添加到这个答案中,如果您使用的是Sublime Text,您可以查看->行尾->Unix。选择Unix,然后再次保存文件。添加到这个答案中,使用
find./-type f-exec dos2 Unix{}\;
转换当前目录中所有文件的行尾。这是我的答案。运行hook/pre-commit(在我的特殊情况下使用pre-commit)确认我在这个脚本中有一个坏角色,这个角色来自一个使用Windows的开发人员。