Перейти к содержимому
ecdsa.com
Git (commit -S, tag -s, commit.gpgsign) with GnuPGGit

Сообщение об ошибке

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`, нет в этой связке ключей.

Почему это происходит

Как исправить

  1. 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. 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

Связанные ошибки

Открыть всю базу ошибок подписей