Saltar al contenido
ecdsa.com
Git (commit -S, tag -s, commit.gpgsign) with GnuPGGit

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

Cómo solucionarlo

  1. 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. 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

Explorar toda la base de datos de errores de firma