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

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

Entitize

Ответов: 31

Ответы (31)

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

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

Если все это выглядит нормально, можно попробовать следующее:

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

Если после этой установки вы повторите попытку git commit и все равно получите ошибку "failed to sign data", сделайте следующее:

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

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

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

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

.

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

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

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

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

Если вы получаете сообщение об ошибке "Inappropriate ioctl for device", сделайте следующее:

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

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

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

git config --global user.signingKey EB11C755

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

git config --global commit.gpgsign true

$ gpg2 -K --keyid-format SHORT          # <-- Shows your keys, e.g.:
/home//.gnupg/pubring.kbx
-------------------------------
sec   rsa4096/0754B01E 2019-02-02 [SCA]             <--secret key
      C396BF3771782D7691B0641145E11B080754B01E
uid         [ultimate] John Doe 
ssb   rsa4096/A20AB8EC 2019-02-02 [E]               <--public key

sec   rsa4096/25C504D5 2019-02-02 [SCA] [revoked: 2020-06-01]
      08BFF49B9E07E4B4B0C4946B645B6C1425C504D5
uid         [ revoked] John Doe 
uid         [ revoked] [jpeg image of size 2670]

Где A20AB8EC - идентификатор ключа, который вы ищете в этом примере.

Сославшись на решение @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] [expires: 2019-06-29]

git config --global user.signingkey 0A61C6FC

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

export GPG_TTY=$(tty)

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


Для macOS,

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

brew install gpg2

brew info gpg

gnupg: stable 2.2.6 (bottled)

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

и есть pinentry-mac для ввода парольной фразы

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

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

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

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

export GPG_TTY=$(tty)

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

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

nano .git/config

Из этого...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@bitbucket.org:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = 
[commit]
    gpgsign = true

Для этого...

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@bitbucket.org:yourrepo/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[user]
    signingkey = 
[commit]
    gpgsign = false

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

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

Но я не получил сообщение об ошибке "Inappropriate ioctl for device", упомянутое в качестве индикатора для этого исправления в другом ответе на этот вопрос.

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

.

Я использую его. Он поддерживает zsh и работает на Windows Subsystem for Linux:

.
export GPG_TTY=$(tty)

Другие пользователи подтвердили, что вышеприведенное изменение является единственным, необходимым для MacOS (например, Catalina 10.15.7). Для компьютеров Mac добавьте указанные выше изменения в ~/.zshrc.

Если вы используете smart card/yubikey для хранения ключа GPG и устанавливаете signkey в git config по ключу, хранящемуся на карте (и все ответы выше, похоже, не решают вашу проблему), заблокированный PIN-код карты может быть первопричиной этой проблемы.

Для проверки заблокированного PIN-кода:

gpg --card-status

Если счетчик похож на

Reader ...........: Yubico YubiKey
PIN retry counter : 3 0 3

Затем ваш PIN-код блокируется (после 3 неудачных попыток).

Чтобы разблокировать PIN-код:

gpg --card-edit
gpg/card> admin
Admin commands are allowed

gpg/card> passwd
gpg: OpenPGP card no. … detected

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? 2
PIN unblocked and new PIN set.

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? q

Решение:

Issue: Disabled loopback pinentry mode

Для решения проблемы необходимо включить режим loopback pinentry в ~/.gnupg/gpg.conf:

.
cat <<'EOF' >> ~/.gnupg/gpg.conf

use-agent
pinentry-mode loopback

EOF

А также в ~/.gnupg/gpg-agent.conf (создайте файл, если он еще не существует):

cat <<'EOF' >> ~/.gnupg/gpg-agent.conf

allow-loopback-pinentry

EOF

Затем перезапустите агент с помощью echo RELOADAGENT | gpg-connect-agent, и все готово!

Источник

Для меня простая brew unintstall gnupg && brew cask reinstall gpg-suite решает проблему.

Он удаляет (в моем случае) вручную установленный на homebrew gpg и заново устанавливает весь GPG Suite.

В моем случае я смешал конфигурацию gpg и конфигурацию smimesign, указанную в документации по подписанию коммитов здесь: https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing-key

После нескольких часов работы над этим, я обнаружил, что лучший способ исправить это - снять все настройки, связанные с gpg, и перенастроить gpg.

Как указано в ответе @Jason Thrasher, найдите все конфигурации git, связанные с gpg, используя:

git config -l | grep gpg

Тогда снимите все настройки глобально, а также локально, используя:

git config --global --unset 
git config --local --unset 

Затем выполните повторную настройку, следуя официальной документации, приведенной выше. Надеюсь, это поможет.

Если у вас уже были настроены pinentry и gpg, но они ни с того ни с сего перестали работать:

Проверьте, работает ли ваш gpg:

echo "test" | gpg --clearsign

Если он говорит gpg: signing failed: No pinentry, просто перезапустите клиент gpg daemon, который время от времени застревает:

gpgconf --kill gpg-agent

Сейчас это должно работать:

echo "test" | gpg --clearsign

У меня была эта проблема на обеих платформах linux/windows, и в моем случае мне просто нужно было обратить более пристальное внимание на вывод. Это было умопомрачительно, потому что я мог использовать ту же настройку для подписи коммитов в других репозиториях.

git commit -m "test signing"
gpg: skipped "***63231079***": No secret key
gpg: signing failed: No secret key
error: gpg failed to sign the data
fatal: failed to write commit object

Я сделал акцент на строке "пропущен". Обратите внимание, что иногда при клонировании репо назначается ключ: эта проблема настолько меня озадачила, что я удалил форкнутое репо, к которому у меня был доступ, и перезалил его на github. Затем, поскольку я думал о "глобальной конфигурации", мне не пришло в голову посмотреть на конфигурацию локального репозитория, и когда я это сделал, то заметил следующее:

[user]
    signingkey = 63231079

Ну, конечно, это не сработало бы, nimrod, git по умолчанию сначала использует локальные настройки, поэтому ваш ключ не подхватился. Я установил указатель через git config и с тех пор он работает.

Если раньше все работало, а теперь не работает, убейте агента и попробуйте снова:

gpgconf --kill gpg-agent

Проверьте, работает ли агент снова:

echo "test" | gpg --clearsign

Что такое gpg: GNU Privacy Guard

использование:

GPG - это отличный метод обеспечения безопасной связи между двумя сторонами. Он позволяет легко обмениваться конфиденциальной информацией через незащищенную сеть.

Простое решение:

Шаг 1: проверьте, не истек ли срок действия ключа, пожалуйста, сделайте

gpg -K --keyid-format SHORT

Шаг 2: В случае, если срок действия не истек

git config --global user.signingkey

У меня возникла эта проблема только что, когда VSCode обновился. Я решил, что агент GPG завис, поскольку команда выполнялась в течение нескольких секунд, прежде чем произошла ошибка. Выполнение команды gpgconf --kill gpg-agent сбросило это и устранило проблему.

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

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

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

.

В моем случае эта ошибка возникала при выполнении git commit на маленьком окне tmux, в котором не помещалась подсказка парольной фразы.

$ echo "test" | gpg --clearsign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

test
gpg: signing failed: Screen or window too small
gpg: [stdin]: clear-sign failed: Screen or window too small

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

git config commit.gpgsign false

Я создал ключ 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) 
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     ]

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

Мне пришлось исправить gpg.program на абсолютный путь к gpg:

git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"

Я использую Windows с cygwin.

У меня была такая ошибка на macos - чтобы попытаться устранить неполадки, я попробовал перечислить ключи, чтобы проверить, не истек ли срок их действия, используя gpg2 --list-keys - я убедился, что срок действия ключей не истек, и что нужный ключ был установлен в моей конфигурации с помощью git config --global user.signingkey.

После выполнения этих команд я внезапно смог снова без проблем выполнять подписанные коммиты. Я не менял свои конфигурационные файлы или ключи - я даже не создавал свежий экземпляр терминала. Просто казалось, что gpg2 каким-то образом находится в странном состоянии на моем mac.

Такая же ошибка может возникнуть, если у вас истек срок действия ключа в конфигурации git.

Пожалуйста, проверьте содержимое cat .git/config и найдите значение signingkey и проверьте, не истек ли срок его действия. Если да, обновите его на новое.

Для меня это решилось тем, что я убедился, что имя ключа совпадает с именем моего пользователя git. Я предполагаю, что и электронные письма должны совпадать. Возможно, это связано с тем, что я использую GPG KeyChain на своем Mac. Не уверен.

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

Форма GPG Keychain

В моем случае мне нужно было сопоставить имя, хранящееся в настройках GitHub, с именем и комментарием ключа.

Так, если gpg --list-keys возвращает uid [ultimate] Joe Blogs (fancy comment) ваше имя в .gitconfig должно быть Joe Blogs (fancy comment).

Изначально мое имя было установлено как Joe Blogs, и GPG не находил мой ключ и выдавал ошибку "no secret key" в strace. К сожалению, эта ошибка не появлялась без strace, и можно было получить общее сообщение

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

Используйте GIT_TRACE=1, чтобы увидеть, где Git дал сбой, затем проверьте все пользовательские конфигурации, используемые Git'ом, и где они определены, затем переопределите их в соответствии с вашими потребностями с помощью :

GIT_TRACE=1 git commit -S -m "this will tell you wich intern git command failed"

git config --list --show-scope --show-origin

У меня были error: gpg failed to sign the data и fatal: failed to write commit object, потому что Git по какой-то причине использовал smimesign по умолчанию, даже если я снял gpg.x509.program ключ, и smimesign не смог найти мой ключ.

.

Так что мне пришлось явно указать Git'у использовать gpg вместо этого :

.
git config --local gpg.x509.program gpg

На моей системе Linux с графическим интерфейсом и gpg 2.2.19 ни убийство gpg-agent (который запускается снова), ни снятие настройки $DISPLAY, ни установка $GPG_TTY не помогли, потому что он пытался использовать pinentry-gnome для запроса пароля с консоли. И срок действия моего ключа не истек.

Из ответа SuperUser на похожий вопрос, Как заставить GPG использовать консольный режим pinentry для запроса паролей?, проблема также может возникнуть, если ваша система имеет графический интерфейс, такой как GNOME, и ваш менеджер пакетов настроен на использование программы GUI pinentry, что и является причиной зависания.

Мне пришлось перейти на pinentry-tty, чтобы заставить GPG снова подписывать сообщения. На Ubuntu это можно сделать, используя шаги из ссылки, которую я процитирую здесь:

sudo apt install pinentry-tty
sudo update-alternatives --config pinentry

Вторая команда покажет вам список программ pinentry и попросит вас ввести число, чтобы выбрать одну из них, поэтому введите число, соответствующее pinentry-tty, и тогда без каких-либо дополнительных усилий подписание сообщений (и git-коммитов) снова будет работать.

Каким-то образом ваш git настроен на подписание GPG каждого коммита. Подписание с помощью GPG не требуется для коммита или push с помощью 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-подпись.

Это сработало для меня на 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
ssb   rsa3072/EFD326E6C611117C 2019-05-06 [E] [expires: 2021-05-05]

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

git config --global user.signingkey 95A854E0593B3214

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

Альтернативный вариант, если вы не против подписываться своим ssh-ключом

.
git config commit.gpgsign false

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

.

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

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

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

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

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

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

Следующим шагом, если есть подключи, срок действия которых истек (в строке отображается sub), сбросьте и их сроки действия:

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

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

2022 WebDevInsider