Saltar al contenido
ecdsa.com
Git commit signing with GnuPG 2Git

Mensaje de error

gpg: signing failed: Inappropriate ioctl for device

También se muestra como

  • [GNUPG:] FAILURE sign 83918950

Git lo imprime debajo de «error: gpg failed to sign the data». Con `--status-fd`, gpg también emite `[GNUPG:] FAILURE sign 83918950` (el código de error numérico de GPG para esta situación).

Git commit signing with GnuPG 2 — pinentry has no terminal

Qué significa

La clave de firma está protegida con una frase de contraseña, gpg-agent lanzó un pinentry de terminal para pedirla y pinentry no pudo abrir una terminal. «Inappropriate ioctl for device» es el `ENOTTY` del sistema operativo: stdin no es una TTY y `GPG_TTY` no indica ninguna. La clave y la configuración están bien; solo falló la solicitud de la frase de contraseña.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Exportar GPG_TTY

    Añádela al perfil de tu shell; actualiza el agente en ejecución con `updatestartuptty` si se inició desde otra terminal.

    bash
    # ~/.bashrc or ~/.zshrc
    export GPG_TTY=$(tty)
    # if gpg-agent was started before, tell it about the current terminal
    gpg-connect-agent updatestartuptty /bye
  2. 2.

    Usar un pinentry gráfico

    `pinentry-mac`, `pinentry-gnome3` o `pinentry-qt` muestran un cuadro de diálogo, que también funciona en los IDE.

    bash
    # macOS (Homebrew): a GUI pinentry works for IDEs and GUI Git clients too
    brew install pinentry-mac
    echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
    gpgconf --kill gpg-agent
  3. 3.

    Pinentry en modo loopback para la automatización

    Con `allow-loopback-pinentry`, gpg puede leer la frase de contraseña desde un archivo. Usa una clave solo de firma dedicada a la CI, nunca una clave personal.

    bash
    # CI: a dedicated signing key; passphrase supplied non-interactively via loopback pinentry
    echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf && gpgconf --kill gpg-agent
    cat > /usr/local/bin/gpg-ci <<'EOF'
    #!/bin/sh
    exec gpg --batch --pinentry-mode loopback --passphrase-file "$GPG_PASSPHRASE_FILE" "$@"
    EOF
    chmod +x /usr/local/bin/gpg-ci
    git config --global gpg.program gpg-ci

Errores relacionados

Explorar toda la base de datos de errores de firma