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应用程序文件夹(相当于
)中,我运行了hooks/post receive以查看这是否工作正常。在我自己的情况下,没有抛出任何错误~/bare repos/mysite.git
- 我很乐意去
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的开发人员。