Git post-receive服务器钩子未执行问题及解决步骤咨询
别着急,服务器端钩子不执行的问题大多是权限、命名或者路径这类基础配置问题,咱们一步步排查:
检查钩子文件的可执行权限:Git要求钩子文件必须具备可执行权限才能运行。登录到服务器,进入钩子所在目录,执行:
chmod +x post-receive执行完后用
ls -l post-receive确认权限,应该能看到类似-rwxr-xr-x的权限标识(包含可执行的x位)。确认钩子文件命名准确:文件名必须是
post-receive,不能带任何后缀(比如.sh、.sample)。如果是从默认的post-receive.sample复制过来的,一定要删掉.sample后缀——Git只会识别无后缀的钩子文件。添加脚本解释器的shebang行:如果你的钩子是shell脚本,第一行必须指定解释器,比如:
#!/bin/sh没有这一行,服务器不知道用什么程序来执行你的脚本,自然不会运行。
验证钩子是否真的没执行(而非输出没显示):本地push时,服务器钩子的输出不一定会直接回显到本地控制台。可以在钩子里加一行输出到服务器的日志文件测试:
echo "post-receive钩子已执行" >> /tmp/git_hook_debug.log执行push后,去服务器查看
/tmp/git_hook_debug.log是否有内容,这样能区分是钩子没执行,还是输出没传到本地。确认钩子的存放路径(针对裸仓库):如果服务器上的仓库是
--bare类型(远程推送仓库一般都是裸仓库),钩子目录不在.git/hooks里,而是直接在仓库根目录的hooks文件夹下。比如你的远程仓库路径是/home/git/myrepo.git,那钩子应该放在/home/git/myrepo.git/hooks/post-receive,而不是里面的.git/hooks(裸仓库没有.git子目录)。检查用户权限与系统日志:执行钩子的是Git服务器运行的用户(比如git用户),要确保这个用户对
post-receive文件有读和执行权限。另外可以查看服务器的系统日志(比如/var/log/syslog或者用journalctl),看有没有钩子执行失败的错误提示;本地push时也可以加GIT_TRACE=1 git push,获取更详细的推送过程日志。
内容的提问来源于stack exchange,提问作者Prashanth

