使用 zsh + powerlevel10k 在终端提交 Git 时 GPG 签名报错
2025/7/25...大约 1 分钟
前言
记录一个每次都会遇到,但是每次遇到都忘记上次是怎么解决的问题。🤪
这个问题一般出现在 Linux 和 Mac 上,在使用 zsh + powerlevel10k 环境下,通过命令行执行 Git 提交时启用了 GPG 签名功能,但 GPG 签名失败,产生如下报错:
error: gpg failed to sign the data:
[GNUPG:] KEY_CONSIDERED AAAAAAAAAAAAA 2
[GNUPG:] BEGIN_SIGNING H8
[GNUPG:] PINENTRY_LAUNCHED 86132 curses 1.3.1 - xterm-256color - - 501/20 0
gpg: signing failed: Inappropriate ioctl for device
[GNUPG:] FAILURE sign 83918950
gpg: signing failed: Inappropriate ioctl for device
fatal: failed to write commit object
主要原因是当前环境无法弹出 GPG 的密码输入对话框。
解决方法
出现这个问题去网上搜,一般都会让我们在 .zshrc
文件中添加一个配置:
export GPG_TTY=$(tty)
如果只是使用 zsh 终端,没有使用 powerlevel10k 主题,那么加这行配置没有问题。
如果恰巧使用了 powerlevel10k 主题,且没有把这行配置加在 .zshrc
文件顶部,那么就会出现这个问题。
解决方法有两种,要么把这行配置放到文件顶部,要么改用下面这个配置:
export GPG_TTY=$TTY
这个配置可以加在任何地方,而且也是更好的解决方法。
在 Zsh 中,
TTY
是一个特殊参数,shell 启动时就会初始化,始终正确反映当前终端设备,并且比执行tty
快 1000 倍左右,即使 stdin 被重定向也不会失效。