Git post-receive脚本执行后git push无限挂起问题排查
Git Push执行post-receive后无限挂起的常见原因
- 脚本意外读取标准输入:Git推送时会维持stdin连接,要是post-receive脚本里用了
read这类默认读stdin的命令,又没指定输入源,就会一直等输入,导致push卡住。解决时可以给命令明确指定输入,或者在脚本开头加exec < /dev/null直接关闭stdin。 - 后台进程未完全脱离会话:如果脚本用
&启动了后台进程,但没处理好IO分离,这个进程会占用Git的stdout/stderr,让push没法正常结束。可以改成nohup 你的命令 > /dev/null 2>&1 &,彻底把进程和当前会话的IO断开。 - 脚本内命令未正常退出:看起来脚本执行成功,但其实某个命令陷入了循环或等待——比如ssh到其他机器需要交互验证、执行了需要用户输入的命令但环境是非交互式的。可以给这类命令加超时(比如用
timeout包裹),或者检查每个命令的返回状态,确保都能正常退出。 - 钩子IO流冲突:post-receive的stdout/stderr如果和Git的IO流混在一起,比如输出到未关闭的管道,会导致Git无法完成推送后的IO同步。可以把脚本输出重定向到日志文件,比如开头加
exec > /var/log/git-hook.log 2>&1,避免和Git的IO冲突。 - 使用了需终端交互的命令:像
top、vim这类依赖终端交互的命令,在Git钩子的非交互式环境里会直接卡住,因为没有终端提供输入。要确保脚本里只用非交互式命令,或者给命令加非交互参数(比如apt-get -y install)。
内容的提问来源于stack exchange,提问作者HarelDanieli
相关产品推荐
相关产品推荐

