Сообщение об ошибке
error: gpg failed to sign the data
Также выводится как
- fatal: failed to write commit object
- gpg: skipped "ABCDEF0123456789": No secret key
- gpg: signing failed: No secret key
После первой строки Git выводит stderr gpg, например «gpg: skipped "<key>": No secret key» или «gpg: signing failed: Inappropriate ioctl for device». Если `gpg.program` не удаётся запустить, Git выводит «(no gpg output)».
Что это означает
Git попросил GnuPG подписать объект коммита или тега, gpg завершился с ошибкой, и Git прервал операцию («fatal: failed to write commit object»). Собственная строка Git ничего не говорит о причине; о ней сообщают строки gpg, выведенные вместе с ней (или строки состояния `[GNUPG:]`). Чаще всего это «No secret key»: ключа, указанного в `user.signingkey`, нет в этой связке ключей.
Почему это происходит
Ключа подписи нет в этой связке ключей
частоЗначение `user.signingkey` скопировано с другой машины, из репозитория dotfiles или из конфигурации CI, а закрытый ключ сюда так и не импортировали (`gpg --list-secret-keys` его не показывает).
gpg не может запросить парольную фразу
частоБез `GPG_TTY`, в IDE, по SSH или в CI у pinentry нет ни терминала, ни графического интерфейса. gpg выдаёт «Inappropriate ioctl for device» или сообщает о тайм-ауте.
Срок действия ключа или подключа для подписи истёк
иногдаgpg отказывается подписывать ключом с истёкшим сроком действия: в строке stderr упоминается истечение срока, или ключ пропускается как непригодный.
Git запускает не тот gpg
иногда`gpg.program` указывает на несуществующий исполняемый файл или на `gpg` 1.x, тогда как ключи хранятся в связке ключей GnuPG 2 (частая ситуация в macOS с несколькими установками).
Как исправить
- 1.
Запустите gpg вручную с настроенным ключом
Если `gpg --clearsign` с тем же ключом завершается ошибкой, проблема в GnuPG, а не в Git, и настоящую причину называет именно сообщение gpg.
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 существующий ключ и настройте pinentry
Используйте длинный идентификатор ключа или отпечаток секретного ключа, который есть на этой машине, явно задайте `gpg.program` и экспортируйте `GPG_TTY` в оболочке.
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
Связанные ошибки
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)