Mensaje de error
error: gpg failed to sign the data
También se muestra como
- fatal: failed to write commit object
- gpg: skipped "ABCDEF0123456789": No secret key
- gpg: signing failed: No secret key
Git imprime el stderr de gpg después de la primera línea, por ejemplo, «gpg: skipped "<key>": No secret key» o «gpg: signing failed: Inappropriate ioctl for device». Cuando no se puede iniciar `gpg.program`, Git imprime «(no gpg output)».
Qué significa
Git pidió a GnuPG que firmara el objeto commit o tag, y gpg terminó con un error, así que Git abortó («fatal: failed to write commit object»). La línea de Git no dice nada de la causa; las líneas de gpg que se imprimen con ella (o las líneas de estado `[GNUPG:]`) sí. La más común es «No secret key»: la clave configurada en `user.signingkey` no existe en este anillo de claves.
Por qué ocurre
La clave de firma no está en este anillo de claves
frecuenteUn valor de `user.signingkey` copiado de otro equipo, de un repositorio de dotfiles o de una configuración de CI; la clave privada nunca se importó aquí (`gpg --list-secret-keys` no la muestra).
gpg no puede pedir la frase de contraseña
frecuenteSin `GPG_TTY`, en un IDE, por SSH o en CI no hay terminal ni interfaz gráfica para pinentry. gpg informa de «Inappropriate ioctl for device» o de un tiempo de espera agotado.
La clave o la subclave de firma está caducada
ocasionalgpg se niega a firmar con una clave caducada; la línea de stderr menciona la caducidad, o la clave se omite por inutilizable.
Git inicia el gpg equivocado
ocasional`gpg.program` apunta a un binario que no existe o a `gpg` 1.x, mientras que las claves están en el anillo de claves de GnuPG 2 (algo habitual en macOS con varias instalaciones).
Cómo solucionarlo
- 1.
Ejecutar gpg directamente con la clave configurada
Si `gpg --clearsign` con la misma clave falla, el problema está en GnuPG, no en Git, y el mensaje de GnuPG es el que cuenta.
bash git config --get user.signingkey gpg --list-secret-keys --keyid-format=long # is that key listed, with a "sec" line? echo test | gpg --clearsign --local-user "$(git config --get user.signingkey)" > /dev/null && echo "gpg can sign" - 2.
Indicar a Git una clave que exista y hacer que pinentry funcione
Usa el ID de clave largo o la huella digital de una clave secreta que exista localmente, establece `gpg.program` explícitamente y exporta `GPG_TTY` en tu shell.
bash KEY=$(gpg --list-secret-keys --with-colons alice@example.com | awk -F: '/^sec/ {print $5; exit}') git config --global user.signingkey "$KEY" git config --global gpg.program "$(command -v gpg)" export GPG_TTY=$(tty) # in ~/.bashrc / ~/.zshrc, so pinentry can ask for the passphrase
Errores relacionados
gpg: signing failed: Inappropriate ioctl for deviceGit commit signing with GnuPG 2error: gpg.ssh.allowedSignersFile needs to be configured and exist for ssh sign…Git (verify-commit, log --show-signature, merge --verify-signatures) with gpg.format=sshgpg: Can't check signature: No public keyGnuPG (gpg --verify, git verify-commit / verify-tag / log --show-signature)