git post-receive钩子未运行

34
我在服务端有一个裸仓库,并且我能够成功地从我的本地机器提交和推送。然而,post-receive 钩子没有运行。细节如下:
  • 使用 SSH 作为协议
  • 我已经将标准的 "post-receive.sample" 重命名为 "post-receive"
  • 此文件具有 -rwxr-xr-x 权限
  • 该文件的所有者与拥有仓库的用户相同,即登录并推送的相同 SSH 用户
  • 实际推送正常进行;文件已更新 - 只是钩子没有运行
  • 我尝试在钩子之前和之后放置echo "Some text",但这不会显示(参见:Post Commit Hook Not Running)。
  • 钩子脚本包含在下面,尽管这似乎不是问题的原因
  • 在 Ubuntu 10.04 上使用 git 1.7.0.4

.

user@server:/home/repos/project1/hooks# cat post-receive
#!/bin/sh
echo "Hook is running..."
export GIT_WORK_TREE=/home/web/project1/www/
git checkout -f
rm -rf /home/web/project1/www/temp/
7个回答

62

为了使Git钩子运行,需要设置权限以允许其可执行。如果钩子似乎没有运行,检查权限,并确保它是可执行的。如果不可执行,可以像这样使所有钩子可执行:

chmod ug+x .git/hooks/*

...或者如果您想让单个钩子(例如post-receive)可执行:

chmod ug+x .git/hooks/post-receive

(感谢这篇文章


1
在'.git/hooks/'中找不到post-receive文件。 - Vineesh TP

33
我曾遇到这个问题,我的脚本文件名中有一个错别字。

使用了 post-recieve 而不是正确的 post-receive。


1
刚刚花了一个小时来调试这个问题...你的答案最终证明是正确的 ‍♂️ 谢谢你。 - Bjarke
谢谢这个,正是我一直无法弄清楚的。下次我会像往常一样复制而不是创建文件。这是一个新的仓库,所以没有现有的样本。 - undefined

13
问题与文件系统的挂载有关。该分区被挂载为noexec,因此无法执行任何文件。这导致钩子无法运行。我移除了noexec标志,现在它可以正常工作了。

3
你是如何去掉这个无钩子部分的? - Armeen Moon
3
我也遇到了同样的问题。我将git目录移动到另一个位置(例如mv .git "$HOME/repo.git"),然后再次运行git init --separate-git-dir=$HOME/repo.git来重新初始化目录。之后,钩子程序按预期运行(确保未设置GIT_WORK_TREE环境变量或其他覆盖,否则.git/config中的工作树不会被使用)。 - Rob W
有人找到了解决方案,使我们能够将.git文件夹移动到“exec”启用的分区中吗? - a coder
我的问题最终是由于我尝试运行的文件权限默默失败了,尽管它正在工作。我不得不使用su -l <user> -c“blah”来测试发生了什么。 - abelito

7
似乎如果代码库没有更改,GIT将不会运行post-receive钩子。
在我的情况下, post钩子没有被执行,但“push”操作一直返回以下消息。
"Everything up-to-date"
所以我只是在我的代码中创建了一个空文件,进行了提交,然后推送到远程。这样post-receive钩子就被执行了。

有相同的问题,但不想让空提交混乱我的分支。没有其他选择吗? - trainoasis
2
我在反复测试以调整我的代码部署时遇到了这个问题。完成设置后,在现实世界中,代码库中总会有更改。因此,大多数人不会关注这个问题。话虽如此,回答你的问题是,我还没有进一步研究这个问题,所以我现在不知道。 - Rakesh
如果情况允许,另一种选择是删除远程分支并重新推送。 - Kiee
为了回答后续问题,您可以通过将远程仓库设置为早期提交来强制更新而不修改堆栈,即 git commit -f branch repo:commit_id。我现在正在处理这个问题,这是我发现的最好的方法。 - Chris

4

我使用MacBook帮助解决了我的问题:

chmod ug+x .husky/*
chmod ug+x .git/hooks/*

0

我在Centos 6系统上遇到了同样的问题,原来SELinux阻止了钩子脚本的运行。将httpd_git_script_t转换为宽容域有所帮助(因为"sesearch -A -s httpd_git_script_t -p exec"没有返回任何结果,即不允许在httpd_git_script_t域中运行进程):

semanage permissive -a httpd_git_script_t

-3
你确定它没有在运行吗?它一定在运行,只是你看不到。我猜测在执行时没有将 stdout 设置为你的 ssh 会话,因此你永远看不到 echo 的输出。该链接建议在本地测试,而不是通过 ssh 进行测试。

8
那应该是一条评论,而不是一个答案。 - halfdan
2
错误的。这是一个答案。Hook正在运行,他只是看不到它。 - Andrew Kolesnikov
2
@AndrewKolesnikov 钩子不运行,我尝试将 echo "test" > /home/web/project1/ 放入其中,并且它没有创建任何文件。在本地尝试时,钩子确实有效。 - user943301
2
你的钩子 必须 放在 user@server:/home/repos/project1/.git/hooks 目录下。 - Andrew Kolesnikov
1
这是一个恰当的回答。这个回答所开始的问题显然是修辞问句。 - Tim Post

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接