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
A chave de assinatura não está neste chaveiro
comumO valor de `user.signingkey` foi copiado de outra máquina, de um repositório de dotfiles ou de uma configuração de CI; a chave privada nunca foi importada aqui (`gpg --list-secret-keys` não a mostra).
O gpg não consegue pedir a frase secreta
comumSem `GPG_TTY`, em uma IDE, via SSH ou no CI, não há terminal nem interface gráfica para o pinentry. O gpg informa “Inappropriate ioctl for device” ou um tempo limite esgotado.
A chave ou a subchave de assinatura expirou
ocasionalO gpg se recusa a assinar com uma chave expirada; a linha do stderr menciona a expiração, ou a chave é ignorada como inutilizável.
O Git inicia o gpg errado
ocasionalO `gpg.program` aponta para um binário inexistente ou para o `gpg` 1.x enquanto as chaves estão no chaveiro do GnuPG 2 (comum no macOS com várias instalações).
Como corrigir
- 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.
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
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)