如何在Git钩子脚本中检测提交是否由GUI应用触发?
检测GUI发起的Git提交以跳过钩子UI
我之前也碰到过一模一样的问题——用Fork这类GUI Git客户端时,钩子脚本里的fzf终端交互直接卡崩了客户端。给你几个实用的检测方案,Zsh和Bash都能直接用:
方案1:检查是否关联终端(最通用)
GUI客户端运行钩子时,通常不会给脚本分配交互式终端。我们可以通过判断标准输出是否连接到终端来识别:
# 在prepare-commit-msg脚本开头添加这段判断 if [[ ! -t 1 ]]; then # 没有终端,说明是GUI发起的提交,跳过fzf UI逻辑 exit 0 fi
这个方法不依赖特定客户端,不管是Fork、SourceTree还是其他GUI工具都能生效,兼容性拉满。
方案2:检查Git编辑器环境变量
像Fork这类GUI客户端会设置专属的GIT_EDITOR变量,我们可以通过这个变量精准识别:
if [[ -n "$GIT_EDITOR" && "$GIT_EDITOR" =~ Fork ]]; then # 确认是Fork发起的提交,跳过UI exit 0 fi
这个方法针对Fork更精准,但如果换用其他GUI客户端,需要调整匹配的字符串。
方案3:检查父进程名称
通过查看脚本的父进程是否是Fork的进程来判断:
# 获取当前脚本的父进程ID PPID=$(ps -o ppid= -p $$) # 获取父进程的名称 PARENT_NAME=$(ps -o comm= -p "$PPID") if [[ "$PARENT_NAME" == "Fork" ]]; then exit 0 fi
注意不同系统的进程名可能有大小写差异,比如Linux上可能是小写的fork,可以调整匹配规则来适配。
我个人最推荐方案1,不用针对不同客户端做适配,一劳永逸。把这段判断放在你的fzf UI逻辑之前,就能彻底避免GUI客户端被钩子卡住的问题了。
内容的提问来源于stack exchange,提问作者iconoclast
相关产品推荐
相关产品推荐

