Git ошибка - gpg не удалось подписать данные

Я только начал использовать git, и я устанавливаю git и gpg через homebrew. По какой-то причине я получаю эту ошибку, когда я делаю git commit Я рассмотрел так много других вопросов о stackoverflow относительно этой темы, и никто из них не работал у меня. Как исправить эту ошибку, чтобы я мог успешно загрузить.

error: gpg failed to sign the data
fatal: failed to write commit object

Ответ 1

Для устранения неполадок, сначала нужно попробовать две вещи:

  • запустите git config --global gpg.program gpg2, чтобы убедиться, что git использует gpg2 а не gpg
  • запустить echo "test" | gpg2 --clearsign echo "test" | gpg2 --clearsign, чтобы убедиться, что сам gpg2 работает

Если все выглядит хорошо, попробуйте еще одну вещь:

  • запустите brew install pinentry чтобы убедиться, что у вас установлен хороший инструмент для ввода парольной фразы

Если после этой установки вы попытаетесь git commit и по-прежнему получаете failed to sign the data ошибке "Не failed to sign the data ":

  • запустите gpgconf --kill gpg-agent чтобы убить любого работающего агента, который может зависнуть

Если это говорит о том, что gpgconf не установлен или не имеет опции --kill, вы можете попробовать это:

  1. cp ~/.gnupg ~/.gnupg-GOOD чтобы сохранить копию вашего ~/.gnupg чтобы при необходимости вернуться к ней позже.
  2. brew install gnupg21 для установки GnuPG 2.1

Причиной сохранения копии вашего ~/.gnupg dir является то, что GnuPG 2.1 потенциально создает/изменяет некоторые ключевые данные таким образом, который не обратно совместим с GnuPG 2.0 и более ранними ~/.gnupg, поэтому, если вы захотите вернуться позже, вы можете выполнить mv ~/.gnupg ~/.gnupg21 && mv ~/.gnupg-GOOD ~/.gnupg.


В противном случае необходимо выполнить несколько основных шагов, чтобы проверить, есть ли у вас рабочая среда GnuPG:

  • запустите gpg2 -K --Keyid-format SHORT, чтобы убедиться, что у вас есть хотя бы одна пара ключей

Если вывод показывает, что у вас нет секретного ключа для использования GnuPG, вам нужно создать его:

  • запустите gpg2 --gen-Key, чтобы GnuPG gpg2 --gen-Key вас по шагам создания пары ключей

Если вы получили сообщение об ошибке "Неправильный ioctl для устройства", сделайте следующее:

  • запустите export GPG_TTY=$(tty) и/или добавьте это в ваш ~/.bashrc или ˜/.bash_profile

Ответ 2

Git должен знать, с каким ключом он подписался.

После установки GPG, gpg-agent и файлов gpg.conf(см. это руководство), вам нужно запустить

git config --global user.signingkey EB11C755

Очевидно, замените открытый ключ в конце своим. Если вы хотите, чтобы каждая фиксация была подписана по умолчанию, используйте

git config --global commit.gpgsign true

Ответ 3

Как-то ваш git настроен на знак GPG для каждого фиксации. Подписание с GPG не требуется для фиксации или нажатия с помощью git. Вероятно, это дает ошибку, потому что ваш механизм подписи gpg еще не настроен.

Если вы новичок в git, попробуйте сначала запустить его без подписания GPG, а затем добавить подписку позже, если вам это действительно нужно.

Вы можете проверить, как настроен ваш git в отношении gpg:

git config -l | grep gpg

Может генерироваться нуль или более строк, включая:

commit.gpgsign=true

Если "commit.gpgsign" имеет значение true, значит, включена подпись gpg. Отключите его:

git config --global --unset commit.gpgsign

Затем повторите попытку. Теперь он должен работать без подписи gpg. После того, как вы начнете работать с базой git, попробуйте добавить к миксу gpg.

Ответ 4

Обратитесь к @sideshowbarker и к решению @Xavier Ho, я решил свою проблему с помощью следующих шагов.

Предположим, gpg2 установлен brew,

git config --global gpg.program gpg2
brew install pinentry
gpgconf --kill gpg-agent
gpg2 -K --keyid-format SHORT
// no key found then generate new one
gpg2 --gen-key

gpg2 -K --keyid-format SHORT 

.../. GnuPG/pubring.gpg

sec rsa2048/0A61C6FC 2017-06-29 [SC] [истекает: 2019-06-29]

git config --global user.signingkey 0A61C6FC

Напомнил мой коллега, нужно добавить

export GPG_TTY=$(tty)

в ~/.zshrc при использовании zsh, иначе добавьте в ~/.bash_profile


Для macOS

gpg2 объединяется с gpg в brew и, следовательно, команда gpg указывает на gpg2

brew install gpg2

варево информация gpg

gnupg: стабильный 2.2.6 (в бутылках)

git config --global gpg.program gpg
gpg -K --keyid-format SHORT 

и там есть pinentry-mac для ввода ключевой фразы

brew install pinentry-mac
vim ~/.gnupg/gpg-agent.conf

Добавить строку

программа pinentry/usr/локальная /bin/pinentry-mac

Ответ 5

Возможно, у вас настроен Git config gpgsign = true. Попытайтесь установить его в false, если вы не хотите, чтобы вы подписали свои коммиты. Перейдите в папку вашего репозитория и измените файл

nano.git/config

Из этого...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = [email protected]:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = <GPG-KEY>
[commit]
    gpgsign = true

Для этого...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = [email protected]:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = <GPG-KEY>
[commit]
    gpgsign = false

Ответ 6

Я испытал эту проблему после обновления до gnupg 2.x. Было видно, что gpg2 ссылается на клавиши по-разному: у меня все еще была signingkey = ABC98F11 (настройка gpg v1) в моем ~/.gitconfig. Ключевыми идентификаторами для gpg2 являются более длинные. Посмотрите их с помощью gpg --list-secret-keys

Ответ 7

Проверьте, чтобы ваш ключ истек. Как только вы исправите дату истечения срока действия (нет необходимости создавать новый ключ, если вы этого не хотите), git будет работать как обычно.

Один из способов исправить истекший ключ:

(Примечание: $ представляет собой приглашение командной строки, введите команды после приглашения, нажмите Enter после каждой команды)

$ gpg2 --list-keys, чтобы найти соответствующий идентификатор ключа (символы после строки \ on pub)

$ gpg2 --edit-key <key id> - это открывает оболочку gpg с подсказкой, измененной на gpg>

gpg> expire - следуйте инструкциям для установки новой даты истечения срока действия для первичного ключа

Далее, если есть истекли дочерние элементы (sub показывает в строке), reset их даты истечения срока действия тоже:

gpg> key 1 - выбирает первый подраздел gpg> expire - следуйте инструкциям, чтобы установить новую дату истечения срока действия для подраздела

При необходимости повторите для каждого последующего подраздела.

Ответ 8

Эта ошибка также может возникнуть, если срок действия ключа GPG истек. Создание нового ключа и добавление его в Git должно решить эту проблему.

Ответ 9

Для меня эта ошибка стала возникать с git tag -s в Debian GNU/Linux, когда я переключился с pinentry-gnome3 на pinentry-curses (используя update-alternatives --config pinentry) для более легкого удаленного доступа. Это происходило только с git tag -s, а не с git tag -s gpg (например, gpg --clearsign).

Единственное изменение, необходимое для того, чтобы это снова export GPG_TTY=$(tty) в этом случае, заключалось в добавлении export GPG_TTY=$(tty) в файлы запуска моей оболочки.

Однако в другом ответе на этот вопрос я не получил сообщение об ошибке "Несоответствующий ioctl для устройства" в качестве индикатора для этого исправления.

Примечание. Поскольку причина получения этой ошибки была совершенно иной, чем для тех, кто предлагал export GPG_TTY=$(tty) до (обычно в качестве дополнительной подсказки) в других ответах на этот вопрос, я решил, что для этого вопроса нужен другой ответ, в котором упоминается тот export GPG_TTY=$(tty) может быть основным исправлением и единственной вещью, необходимой в некоторых случаях.

Ответ 10

Я использую это. Он поддерживает zsha и работает в подсистеме Windows для Linux:

export GPG_TTY=$(tty)

Ответ 11

Я сделал ключ git с 3 отдельными клавишами для certify/sign/encrypt, и ключ показал, что истек в будущем (после работы в течение нескольких дней):

pub   rsa4096/4CD1E9DA 2017-04-26 [C] [expired: 2017-04-28]
      Key fingerprint = 4670 59C1 7592 08B8 7FA5  313B 2A42 B6A6 4CD1 E9DA
uid         [ expired] Stuart Cardall (GIT Development Keys) <xxxxxx>
sub   rsa4096/5195E715 2017-04-26 [E] [expired: 2019-04-26]
sub   rsa4096/DB74C297 2017-04-26 [S] [expired: 2019-04-26]
sub   rsa2048/A3913A3C 2017-04-28 [] [expired: never     ]

сделал новый ключ, не добавляя отдельные подразделы для решения проблемы.

Ответ 12

Я решил проблему с установкой brew install gpg2 выполнил git config --global gpg.program gpg2

Ответ 13

Это работало для меня на Ubuntu 18.04

Проверьте свой ключ GPG

gpg -K --keyid-format LONG

если вы получили пустой ответ, сгенерируйте ключ GPG

gpg --generate-key

перезапустите первую команду, вы должны получить вывод как:

sec   rsa3072/95A854E0593B3214 2019-05-06 [SC] [expires: 2021-05-05]
      AF2F7514568DC26B0EB97B9595A854E0593B74D8
uid                 [ultimate] yourname<your_email>
ssb   rsa3072/EFD326E6C611117C 2019-05-06 [E] [expires: 2021-05-05]

установить git пение ключ

git config --global user.singingkey 95A854E0593B3214

тогда тебе пора! (--global является необязательным)

В качестве альтернативы, если вы не против подписи с помощью ключа ssh

git config commit.gpgsign false

обратите внимание, что это не рекомендуется из-за проблем безопасности в соответствии с этим вопросом здесь и здесь

Ответ 14

Это поможет вам избавиться от этого

git config commit.gpgsign false