Fehlermeldung
error: gpg failed to sign the data
Auch ausgegeben als
- fatal: failed to write commit object
- gpg: skipped "ABCDEF0123456789": No secret key
- gpg: signing failed: No secret key
Git gibt den stderr von gpg nach der ersten Zeile aus, zum Beispiel „gpg: skipped "<key>": No secret key“ oder „gpg: signing failed: Inappropriate ioctl for device“. Lässt sich `gpg.program` nicht starten, gibt Git „(no gpg output)“ aus.
Was der Fehler bedeutet
Git hat GnuPG gebeten, das Commit- oder Tag-Objekt zu signieren, und gpg hat sich mit einem Fehler beendet, deshalb hat Git abgebrochen („fatal: failed to write commit object“). Die Zeile von Git selbst sagt nichts über die Ursache; das tun die mit ausgegebenen gpg-Zeilen (oder die Statuszeilen `[GNUPG:]`). Am häufigsten ist „No secret key“: Den konfigurierten `user.signingkey` gibt es in diesem Schlüsselbund nicht.
Warum der Fehler auftritt
Der Signaturschlüssel ist nicht in diesem Schlüsselbund
häufig`user.signingkey` wurde von einem anderen Rechner, aus einem Dotfiles-Repository oder aus einer CI-Konfiguration übernommen; der private Schlüssel wurde hier nie importiert (`gpg --list-secret-keys` zeigt ihn nicht an).
gpg kann die Passphrase nicht abfragen
häufigOhne `GPG_TTY`, in einer IDE, über SSH oder in der CI gibt es kein Terminal und keine GUI für pinentry. gpg meldet „Inappropriate ioctl for device“ oder ein Timeout.
Der Schlüssel oder der Unterschlüssel zum Signieren ist abgelaufen
gelegentlichgpg verweigert das Signieren mit einem abgelaufenen Schlüssel; die stderr-Zeile erwähnt den Ablauf, oder der Schlüssel wird als unbrauchbar übersprungen.
Git startet das falsche gpg
gelegentlich`gpg.program` zeigt auf ein fehlendes Binary oder auf `gpg` 1.x, während die Schlüssel im Schlüsselbund von GnuPG 2 liegen (häufig unter macOS mit mehreren Installationen).
So behebst du den Fehler
- 1.
gpg selbst mit dem konfigurierten Schlüssel ausführen
Schlägt `gpg --clearsign` mit demselben Schlüssel fehl, liegt das Problem bei GnuPG, nicht bei Git – und die Meldung von gpg ist die eigentliche.
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.
Git auf einen vorhandenen Schlüssel verweisen und pinentry lauffähig machen
Verwende die lange Schlüssel-ID oder den Fingerabdruck eines lokal vorhandenen geheimen Schlüssels, setze `gpg.program` explizit und exportiere `GPG_TTY` in deiner 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
Verwandte Fehler
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)