601 votes

Gpg n'a pas réussi à signer les données fatal: échec d'écriture de l'objet de commit [Git 2.10.0]

J'ai suivi quelques articles sur les attributs pretty sur les notes de version de Git 2.10. En parcourant cela, j'ai mis à jour git vers la version 2.10.0 et j'ai apporté des modifications au .gitconfig global, ce qui a donné les résultats suivants -

[filter "lfs"]
    clean = git-lfs clean %f
    smudge = git-lfs smudge %f
    required = true
[user]
    name = xyz
    email = abc.def@gmail.com
    signingkey = AAAAAAA
[core]
    excludesfile = /Users/xyz/.gitignore_global
    editor = 'subl' --wait
[difftool "sourcetree"]
    cmd = opendiff \"$LOCAL\" \"$REMOTE\"
    path = 
[mergetool "sourcetree"]
    cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
    trustExitCode = true
[alias]
    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
[color "diff"]
    old = red strike
    new = green italic

Mais maintenant, lorsque j'essaie de signer mes commits en utilisant

git commit -a -S -m "message"

Je vois l'erreur suivante -

Vous devez entrer une passphrase pour déverrouiller la clé secrète de

l'utilisateur : "XYZ (Signé numériquement) "

Clé RSA 2048 bits, ID AAAAAAAA, créée le 01-07-2016

erreur : gpg n'a pas pu signer les données fatale : impossible d'écrire l'objet de commit

Remarque - Je peux toujours valider les modifications en utilisant git commit -a -m "message"

Y a-t-il un moyen de surmonter cela ? Ou des modifications sont-elles nécessaires dans les configurations gpg pour s'adapter à la mise à jour de git ?


Mise à jour 1

Recherchant également une utilité supplémentaire, suivant Existe-t-il un moyen de "signer automatiquement" les commits dans Git avec une clé GPG ?. J'ai déjà configuré la clé en utilisant

git config --global user.signingkey ED5CDE14(avec ma clé)
git config --global commit.gpgsign true

et évidemment, je reçois toujours la même erreur de toute façon.

4 votes

Je rencontre un problème similaire. J'ai désinstallé Git 2.8 (git-scm) sur Windows. Et j'ai installé la version 2.10. Maintenant j'obtiens gpg a échoué à signer les données chaque fois que j'utilise -S. Avec la version 2.8, je pouvais signer un commit sans problème. Je ne sais pas ce qui s'est passé.

10 votes

Ajouter user.signingkey a résolu mon problème, étrangement.

0 votes

825voto

Andy Hayden Points 38010

J'ai rencontré ce problème avec OSX.

Réponse initiale:

Il semble qu'une mise à jour de gpg (de brew) ait changé l'emplacement de gpg en gpg1, vous pouvez modifier le binaire utilisé par git pour chercher gpg:

git config --global gpg.program gpg1

Si vous n'avez pas gpg1: brew install gpg1.

Réponse mise à jour:

Il semblerait que gpg1 soit en train d'être obsolète/"gentiment poussé vers la sortie", donc vous devriez probablement passer à gpg2, malheureusement cela implique quelques étapes supplémentaires/un peu de temps :

brew upgrade gnupg  # Cela comporte une étape de compilation qui prend du temps
brew link --overwrite gnupg
brew install pinentry-mac

sur les anciennes versions de homebrew :

echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
killall gpg-agent

Sur des systèmes plus récents comme les mac M1 :

echo "pinentry-program /opt/homebrew/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf 
killall gpg-agent

La première partie installe gpg2, et la seconde est un hack nécessaire pour l'utiliser. Pour le dépannage, consultez cette réponse (bien que cela concerne linux et non brew), elle suggère un bon test :

echo "test" | gpg --clearsign  # sur linux c'est gpg2 mais brew reste gpg

Si ce test est réussi (pas d'erreur/la sortie inclut une signature PGP), vous avez correctement mis à jour vers la dernière version de gpg.

Vous devriez maintenant pouvoir utiliser à nouveau la signature git !
Il est bon de noter que vous devrez avoir :

git config --global gpg.program gpg  # peut-être l'aviez-vous déjà ? Sous linux peut-être gpg2
git config --global commit.gpgsign true  # si vous souhaitez signer chaque commit

Remarque : Après avoir effectué un commit signé, vous pouvez vérifier s'il est signé avec :

git log --show-signature -1

qui inclura les informations gpg pour le dernier commit.

9 votes

Définir gpg.program sur /usr/local/bin/gpg (sans "1") a résolu le problème pour moi.

0 votes

@nullpointer désolé, je viens juste de voir le deuxième commentaire. On dirait que cela est discuté sur github, en gros, il semble que : c'était dans les avertissements, personne ne lit les avertissements!

5 votes

Il semble qu'une mise à jour de gnupg2 avec brew ait compliqué les liens symboliques, donc gpg a été supprimé, j'ai dû corriger les liens en utilisant brew link --overwrite gnupg2.

619voto

Koraktor Points 9532

Si gnupg2 et gpg-agent 2.x sont utilisés, assurez-vous de définir la variable d'environnement GPG_TTY.

export GPG_TTY=$(tty)

Voir la documentation de GPG sur les problèmes courants.

41 votes

Si vous utilisez du poisson, mettez set -x GPG_TTY (tty) sur votre profil.

0 votes

@StuartCardall Quel est l'intérêt de la commande chown ? En général, elle vous aura déjà été attribuée par un processus système lorsque vous vous êtes connecté ou avez créé un pseudo-tty. Si elle appartient à quelqu'un d'autre et que vous n'êtes pas root, elle échouera. Si le groupe est différent, cela n'aura probablement pas d'importance, et les utilisateurs ne seront généralement pas dans le groupe tty.

0 votes

@poolie - cela importe si vous su sur un serveur distant en tant que root

381voto

Bombe Points 34185

Si tout échoue, utilisez GIT_TRACE=1 pour essayer de voir ce que git fait réellement :

$ GIT_TRACE=1 git commit -m "Ajouter une page qui nécessite toujours un utilisateur connecté"
20:52:58.902766 git.c:328               trace: built-in: git 'commit' '-vvv' '-m' 'Ajouter une page qui nécessite toujours un utilisateur connecté'
20:52:58.918467 run-command.c:626       trace: run_command: 'gpg' '--status-fd=2' '-bsau' '23810377252EF4C2'
erreur: échec de gpg pour signer les données
fatal: échec de l'écriture de l'objet de validation

Exécutez maintenant la commande en échec manuellement :

$ gpg -bsau 23810377252EF4C2
gpg: sauté "23810377252EF4C2" : Clé secrète inutilisable
gpg: signature échouée : Clé secrète inutilisable

Il s'avère que ma clé était expirée, ce n'était pas la faute de git.

11 votes

Cela m'a réellement aidé à résoudre mon propre problème, et c'est une solution pour tout type de problème avec ce message d'état. +1

0 votes

Merci pour le guide de débogage. Ma clé était également expirée.

3 votes

Merci! Cela m'a mené à mon problème. Étrangement, mon .git/config local avait un nom spécifié dans un projet qui ne correspondait pas à mon adresse e-mail de signature. C'était suffisant pour le rejeter.

155voto

SHi ON Points 1621

J'ai FAIT cela grâce à cette recette courte et facile :

Auto-signer les commits sur macOS (globalement et avec différents IDE) :

Obtenez votre clé de signature de cette manière.

brew install gnupg gnupg2 pinentry-mac
git config --global user.signingkey 
git config --global commit.gpgsign true
git config --global gpg.program gpg

Mettez ce qui suit dans le fichier gpg.conf (modifiez le fichier avec la commande nano ~/.gnupg/gpg.conf) :

no-tty

Mettez ce qui suit dans le fichier gpg-agent.conf (modifiez le fichier avec la commande nano ~/.gnupg/gpg-agent.conf) :

pinentry-program /usr/local/bin/pinentry-mac

Mise à jour :

Comme suggéré dans les commentaires, vous pourriez avoir besoin d'exécuter la commande killall gpg-agent après avoir modifié le fichier de configurations, gpg.conf, selon les commentaires. Inutile de dire que cette commande mettra fin à l'agent GPG (Gnu Privacy Guard).

4 votes

Pouvez-vous également expliquer ce que font ces commandes? Cela aidera à comprendre.

17 votes

J'ai également dû exécuter un killall gpg-agent après avoir défini les fichiers de configuration, puis cela a fonctionné!

0 votes

Comment pouvons-nous savoir que nous pouvons faire confiance aux personnes derrière pinentry-mac? Je ne dis pas que nous ne pouvons pas, mais l'organisation GPGTools est soutenue par une très petite équipe et le dépôt n'a que 5 contributeurs contre l'utilisation de brew install gnupg qui exploite le travail de gnupg.org.

112voto

MaximKostrikin Points 330

Peut aider à tuer le processus gpg-agent qui pourrait être bloqué avec des données anciennes. Ainsi, un nouveau gpg-agent démarré demanderait le mot de passe.

35 votes

Utilisez gpg-agent --daemon pour le démarrer

3 votes

J'ai dû redémarrer gpg-agent aussi

33 votes

Pour tuer le processus sur macOS : killall gpg-agent

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X