Pular para o conteúdo
ecdsa.com
Git (commit -S, tag -s, commit.gpgsign) with GnuPGGit

Mensagem de erro

error: gpg failed to sign the data

Também aparece como

  • fatal: failed to write commit object
  • gpg: skipped "ABCDEF0123456789": No secret key
  • gpg: signing failed: No secret key

O Git imprime o stderr do gpg depois da primeira linha, por exemplo, “gpg: skipped "<key>": No secret key” ou “gpg: signing failed: Inappropriate ioctl for device”. Quando não é possível iniciar o `gpg.program`, o Git imprime “(no gpg output)”.

O que significa

O Git pediu ao GnuPG para assinar o objeto de commit ou de tag, o gpg terminou com erro e o Git abortou (“fatal: failed to write commit object”). A linha do próprio Git não diz nada sobre a causa; as linhas do gpg impressas junto com ela (ou as linhas de status `[GNUPG:]`) dizem. A mais comum é “No secret key”: a chave configurada em `user.signingkey` não existe neste chaveiro.

Por que acontece

Como corrigir

  1. 1.

    Rodar o gpg manualmente com a chave configurada

    Se `gpg --clearsign` com a mesma chave falhar, o problema está no GnuPG, não no Git — e a mensagem dele é a verdadeira.

    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.

    Apontar o Git para uma chave existente e fazer o pinentry funcionar

    Use o ID da chave em formato longo ou a impressão digital de uma chave privada que exista localmente, defina `gpg.program` explicitamente e exporte `GPG_TTY` no seu 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

Erros relacionados

Ver toda a base de erros de assinatura