You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git pre-push钩子中read命令未等待用户输入直接跳过的问题咨询

Git pre-push钩子中read命令不等待输入的问题解决

问题原因

Git在执行钩子脚本时,会将脚本的**标准输入(stdin)**重定向为Git内部的数据流(而非用户的交互式终端)。当read命令尝试从stdin读取内容时,会直接读到EOF(文件结束符),导致变量response为空,脚本直接进入退出分支。而手动运行脚本时,stdin默认连接到终端,所以能正常等待输入。

解决方案

让read命令直接从用户终端设备(/dev/tty)读取输入,而非依赖Git提供的stdin。以下是两种可行的修改方式:

方式1:单独为read命令指定输入源

修改后的pre-push脚本:

#!/bin/bash

echo "Do you want to continue (o/n) ?"
# 明确从终端读取输入
read -r response </dev/tty
if [[ "$response" =~ ^[oO]$ ]]; then
    echo "Continue ...."
else
    echo "Stop !!!!"
    exit 1
fi
exit 0

方式2:全局重定向脚本输入到终端

在脚本开头添加输入重定向,让整个脚本的输入都来自终端:

#!/bin/bash
# 将脚本的标准输入重定向到终端
exec < /dev/tty

echo "Do you want to continue (o/n) ?"
read -r response
if [[ "$response" =~ ^[oO]$ ]]; then
    echo "Continue ...."
else
    echo "Stop !!!!"
    exit 1
fi
exit 0

额外注意事项

  1. 确保脚本使用#!/bin/bash作为解释器:[[ ]]是Bash的扩展语法,部分系统的/usr/bin/sh是Dash等轻量Shell,不支持该语法。
  2. 给钩子脚本添加可执行权限:运行chmod +x .git/hooks/pre-push确保Git能执行该脚本。

内容的提问来源于stack exchange,提问作者mnekkach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 14:05:02