Message d’erreur
error: gpg failed to sign the data
Également affiché sous la forme
- fatal: failed to write commit object
- gpg: skipped "ABCDEF0123456789": No secret key
- gpg: signing failed: No secret key
Git affiche la sortie stderr de gpg après la première ligne, par exemple « gpg: skipped "<key>": No secret key » ou « gpg: signing failed: Inappropriate ioctl for device ». Lorsque `gpg.program` ne peut pas être lancé, Git affiche « (no gpg output) ».
Ce que cela signifie
Git a demandé à GnuPG de signer l’objet commit ou tag, et gpg s’est terminé avec une erreur : Git a donc abandonné (« fatal: failed to write commit object »). La ligne de Git elle-même ne dit rien de la cause ; ce sont les lignes de gpg affichées avec elle (ou les lignes d’état `[GNUPG:]`) qui la donnent. La cause la plus courante est « No secret key » : la clé configurée dans `user.signingkey` n’existe pas dans ce trousseau.
Pourquoi cela se produit
La clé de signature n’est pas dans ce trousseau
fréquenteUne valeur `user.signingkey` copiée depuis une autre machine, un dépôt de dotfiles ou une configuration de CI ; la clé privée n’a jamais été importée ici (`gpg --list-secret-keys` ne l’affiche pas).
gpg ne peut pas demander la phrase de passe
fréquenteSans `GPG_TTY`, dans un IDE, via SSH ou en CI, pinentry ne dispose ni d’un terminal ni d’une interface graphique. gpg signale « Inappropriate ioctl for device » ou un dépassement de délai.
La clé ou la sous-clé de signature a expiré
occasionnellegpg refuse de signer avec une clé expirée ; la ligne stderr mentionne l’expiration, ou la clé est ignorée car inutilisable.
Git lance le mauvais gpg
occasionnelleUn `gpg.program` qui pointe vers un binaire absent ou vers `gpg` 1.x, alors que les clés se trouvent dans le trousseau de GnuPG 2 (fréquent sous macOS lorsque plusieurs installations coexistent).
Comment corriger l’erreur
- 1.
Lancer gpg vous-même avec la clé configurée
Si `gpg --clearsign` échoue avec la même clé, le problème vient de GnuPG et non de Git – et c’est son message qui donne la véritable erreur.
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.
Indiquer à Git une clé existante et faire fonctionner pinentry
Utilisez l’identifiant de clé long ou l’empreinte d’une clé secrète présente localement, définissez `gpg.program` explicitement et exportez `GPG_TTY` dans votre 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
Erreurs associées
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)