Gpg не удалось подписать данные фатальным: не удалось записать объект фиксации [Git 2.10.0]

Я последовал за несколько статей по поводу довольно атрибуты Git 2,10 примечание к выпуску. Пройдя через который обновили git до 2.10.0 и внесли изменения в глобальный .gitconfig, как показано ниже:

[filter "lfs"]
    clean = git-lfs clean %f
    smudge = git-lfs smudge %f
    required = true
[user]
    name = xyz
    email = [email protected]
    signingkey = AAAAAAA
[core]
    excludesfile = /Users/xyz/.gitignore_global
    editor = 'subl' --wait
[difftool "sourcetree"]
    cmd = opendiff \"$LOCAL\" \"$REMOTE\"
    path = 
[mergetool "sourcetree"]
    cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
    trustExitCode = true
[alias]
    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
[color "diff"]
    old = red strike
    new = green italic

Но теперь, когда я пытаюсь подписать свои коммиты с помощью

git commit -a -S -m "message"

Я вижу следующую ошибку -

Вам нужна кодовая фраза, чтобы разблокировать секретный ключ для

пользователь: "XYZ (цифровая подпись)"

2048-разрядный ключ RSA, ID AAAAAAAA, созданный 2016-07-01

ошибка: gpg не удалось подписать данные фатально: не удалось записать commit объект

Примечание. Я все еще могу зафиксировать изменения, используя git commit -a -m "message"

Есть ли способ преодолеть то же самое? Или любые изменения, необходимые в конфигурациях gpg, чтобы сочетаться с обновлением git?


Обновление 1

Также ищут дополнительную полезность, следуя Есть ли способ "autosign" фиксируется в git с помощью GPG-ключа?. Я уже настроил ключ, используя

git config --global user.signingkey ED5CDE14(with my key) 
git config --global commit.gpgsign true

и, очевидно, все равно получит ту же ошибку.

Ответ 1

Я столкнулся с этой проблемой с OSX.

Оригинальный ответ:

Кажется, что обновление gpg (из brew) изменено на местоположение от gpg до gpg1, вы можете изменить двоичный файл, где git просматривает gpg:

git config --global gpg.program gpg1

Если у вас нет gpg1: brew install gpg1.

Обновленный ответ:

Похоже, что gpg1 устарел / "мягко вытолкнул из использования" , поэтому вы, вероятно, должны обновить до gpg2, к сожалению, это связано с еще несколько шагов/немного времени:

brew upgrade gnupg  # This has a make step which takes a while
brew link --overwrite gnupg
brew install pinentry-mac
echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
killall gpg-agent

Первая часть устанавливает gpg2, а последняя - взлом, необходимый для использования. Для устранения неполадок см. этот ответ (хотя это касается Linux не brew), это предлагает хороший тест:

echo "test" | gpg --clearsign  # on linux it gpg2 but brew stays as gpg

Если этот тест успешный (нет ошибки/вывода, включающего подпись PGP), вы успешно обновились до последней версии gpg.

Теперь вы можете снова использовать подпись git!

Стоит отметить, что вам нужно будет:

git config --global gpg.program gpg  # perhaps you had this already? On linux maybe gpg2
git config --global commit.gpgsign true  # if you want to sign every commit

Примечание. После того, как вы выполнили подписанный коммит, вы можете проверить его с помощью:

git log --show-signature -1

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

Ответ 3

Если все не удается, используйте GIT_TRACE=1, чтобы попытаться посмотреть, что действительно делает git:

$ GIT_TRACE=1 git commit -m "Add page that always requires a logged-in user"
20:52:58.902766 git.c:328               trace: built-in: git 'commit' '-vvv' '-m' 'Add page that always requires a logged-in user'
20:52:58.918467 run-command.c:626       trace: run_command: 'gpg' '--status-fd=2' '-bsau' '23810377252EF4C2'
error: gpg failed to sign the data
fatal: failed to write commit object

Теперь запустите команду failing вручную:

$ gpg -bsau 23810377252EF4C2
gpg: skipped "23810377252EF4C2": Unusable secret key
gpg: signing failed: Unusable secret key

Оказывается, мой ключ истек, git не виноват.

Ответ 4

У меня DONE через этот короткий и простой рецепт:

Автоматический знак фиксируется на MacOS (глобально и с разными IDE):

Получите signingkey в таким образом.

brew install gnupg gnupg2 pinentry-mac
git config --global user.signingkey <YOUR_SIGNING_KEY>
git config --global commit.gpgsign true
git config --global gpg.program gpg

Поместите следующее в файл gpg.conf (отредактируйте файл с помощью команды nano ~/.gnupg/gpg.conf):

no-tty

Поместите следующее в файл gpg-agent.conf (отредактируйте файл с помощью команды nano ~/.gnupg/gpg-agent.conf):

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

Ответ 5

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

Ответ 6

Следуйте нижеприведенному URL для настройки подписанного коммита https://help.github.com/en/articles/telling-git-about-your-signing-key

если все еще получаю gpg не удалось подписать данные фатально: не удалось записать объект фиксации

это не проблема с Git, это с GPG следуйте инструкциям ниже

1. gpg --version

  1. echo "test" | gpg --clearsign

если он показывает:

gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
  1. затем используйте export GPG_TTY=$(tty)

4. затем снова попробуйте echo "test" | gpg --clearsign в котором получена подпись PGP.

  1. git config -l | grep gpg

gpg.program = GPG commit.gpgsign = истина

6.применить git commit -S -m "commitMsz"

Ответ 7

Мои два цента здесь:

Когда вы создаете и добавляете ключ в gpg-agent, вы определяете нечто, называемое passphrase. Теперь, когда в определенный момент истекает срок действия passphrase, gpg необходимо, чтобы вы снова passphrase ее, чтобы разблокировать ключ, чтобы вы могли снова начать подписывать.

Когда вы используете любую другую программу, которая взаимодействует с gpg, gpg предлагает вам ввести вашу парольную фразу (в основном, gpg-agent при демонизации не может показать вам диалог ввода в stdin).

Одним из решений является gpg --sign a_file.txt затем введите кодовую фразу, которую вы ввели при создании ключа, и тогда все должно быть в порядке (gpg-agent должен автоматически подписывать)

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

Или вы можете полностью удалить фразу-пароль с помощью ssh-keygen -p

Ответ 8

Любой, кто сталкивается с этой проблемой на компьютерах MacOS, попробуйте это:

  1. brew uninstall gpg
  2. brew install gpg2
  3. brew install pinentry-mac (при необходимости)
  4. gpg --full-generate-key Создать ключ с помощью алгоритма.
  5. Получить сгенерированный ключ, выполнив: gpg --list-keys
  6. Установите здесь ключ git config --global user.signingkey <Key from your list>
  7. git config --global gpg.program/usr/local/bin/gpg
  8. git config --global commit.gpgsign true
  9. Если вы хотите экспортировать свой ключ в GitHub, то: gpg --armor --export <key> и добавьте этот ключ в GitHub в ключах GPG: https://github.com/settings/keysgpg --armor --export <key> START и END)

Если проблема все еще существует:

test -r ~/.bash_profile && echo 'export GPG_TTY=$(tty)' >> ~/.bash_profile

echo 'export GPG_TTY=$(tty)' >> ~/.profile

Если проблема все еще существует:

Установите https://gpgtools.org и подпишите ключ, который вы использовали, нажав Sign в строке меню: Key → Sign

Если проблема все еще существует:

Перейти к: Ваш глобальный .gitconfig файл, который в моем случае на: /Users/gent/.gitconfig И изменить файл .gitconfig (пожалуйста, убедитесь, что e - mail и имя одинаковы с той, которую вы создали время Генерация ключа):

[user]
	email = [email protected]
	name = Gent
	signingkey = <YOURKEY>
[gpg]
	program = /usr/local/bin/gpg
[commit]
	gpsign = true
	gpgsign = true
[filter "lfs"]
	process = git-lfs filter-process
	required = true
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
[credential]
	helper = osxkeychain

Ответ 9

Обновление октябрь 2016: проблема 871 упоминала: "Подписание перестало работать в Git 2.9.3"

Git для Windows 2.10.1, выпущенный два дня назад (4 октября 2016 года), зафиксировал подписку на Интерактивное GPG коммитов и тег.

недавнее изменение gpg-знака в Git (что не представляет проблемы в Linux) вызывает проблему в том, как в Windows, не MSYS2- git взаимодействует с MSYS2-gpg.


Оригинальный ответ:

Чтение " 7.4 Git Инструменты - Подписание вашей работы", я полагаю, у вас есть ваш user.signingkey".

Последний большой рефакторинг (до Git 2.10) вокруг gpg находился в commit 2f47eae2a, здесь сообщение об ошибке было перенесено на gpg-interface.c

Журнал в этом файле показывает недавнее изменение commit af2b21e (Git 2.10)

gpg2 уже использует длинный формат по умолчанию, но большинство дистрибутивов по-прежнему по-прежнему имеют "gpg" более старую версию 1.x из-за соображений совместимости. И более старые версии gpg показывают только 32-битный короткий идентификатор, который довольно небезопасен.

Это не имеет значения для самой проверки: если проверка проходит, подпись pgp хороша.
Но если вы этого не сделаете на самом деле еще есть ключ, и хотите получить его, или вы хотите проверить точно, какой ключ использовался для проверки и хотите его проверить, мы должен указывать ключ с большей точностью.

Итак, проверьте, как вы указали конфигурацию user.signingkey и версию gpg, которую используете (gpg1 или gpg2), чтобы узнать, не влияют ли эти сообщения на ошибку.

Существует также commit 0581b54, который изменяет условие сообщения об ошибке gpg failed to sign the data (в дополнение к commit 0d2b664):

В настоящее время мы не читаем stderr. Тем не менее, мы захотим в будущем патче, так что это также подготавливает нас там (и в этом случае gpg пишет перед чтением всего ввода, хотя, опять же, маловероятно, что ключевой uid заполнит буфер буфера).

Commit 4322353 показывает, что gpg теперь использует временный файл, поэтому могут возникнуть проблемы.

Разрешить преобразование в объект tempfile, который обрабатывает жесткие случаи для нас, и добавьте отсутствующий вызов очистки.

Ответ 10

Используя cygwin, я недавно переключился на gpg2. Тогда у меня была та же проблема для подписания с git после установки git config gpg.program gpg2.

Попробуйте echo "test" | gpg2 --clearsign посмотреть, работает ли gpg2. Я нашел это самое простое решение, просто установив git config gpg.program gpg, потому что это работает. Но вы также получите лучшую ошибку таким образом - например, что вам нужно установить pinentry.

Ответ 11

Этот мерзавец был очень показателен для моей ситуации...

   GIT_TRACE=1 git commit -m "a commit message"
   13:45:39.940081 git.c:344               trace: built-in: git commit -m 'a commit message'
   13:45:39.977999 run-command.c:640       trace: run_command: gpg --status-fd=2 -bsau 'full name <[email protected]>'
   error: gpg failed to sign the data
   fatal: failed to write commit object

Мне нужно было сгенерировать начальный ключ в соответствии с форматом, который проверял git. Лучше всего скопировать значение, переданное -bsau выше в журналах, как есть, и использовать ниже.

Так и становится,

   gpg --quick-generate-key "full name <[email protected]>"

Тогда это сработало.

Надеюсь, это поможет.

Ответ 12

Я столкнулся с той же проблемой. Я рад сообщить, что проблема заключается не в git 2.10.0, а в gnupg 1.4.21.

Временное понижение gnupg до 1.4.20 исправило проблему для меня.

Если вы используете доморощенный, и вы обновили свои пакеты, как я, вы можете просто запустить brew switch gnupg 1.4.20, чтобы вернуться назад.

Ответ 14

Убедитесь, что ваш адрес электронной почты установлен правильно.

git config --global user.email "[email protected]"

Ответ 15

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

Вы можете добавить другой UID, используя:

$gpg --edit-key

Смотрите для mo https://superuser.com/questions/293184/one-gnupg-pgp-key-pair-two-emails

Ответ 16

Я, должно быть, как-то случайно обновил gpg, потому что получил это после попытки проверить, работает ли gpg:

gpg: WARNING: server 'gpg-agent' is older than us (2.1.21 < 2.2.10)
gpg: Note: Outdated servers may lack important security fixes.
gpg: Note: Use the command "gpgconf --kill all" to restart them.

Запуск gpgconf --kill all исправил для меня.

Надеюсь, это кому-нибудь поможет.

Ответ 17

Я получил эту ошибку в Ubuntu 18.04, и оказалось, что мой ключ истек.

Чтобы увидеть это, я запустил это и подтвердил, что срок действия моих ключей истек:

gpg --list-keys

Чтобы исправить это, я запустил (используя идентификатор, указанный в предыдущей команде):

gpg --edit-key <ID>

Оттуда я продлил срок действия key 0 и key 1, следуя этим инструкциям, которые сводились к вводу key 0, затем expire и следуя подсказкам. Затем повторите для key 1.

Затем, чтобы проверить это, я запустил:

echo test | gpg --clearsign

А до исправления произошла ошибка:

gpg: no default secret key: No secret key
gpg: [stdin]: clear-sign failed: No secret key

Но после исправления та же команда успешно подписала сообщение, так что я знал, что все снова работает!

Ответ 18

У меня была аналогичная проблема с последними Git источниками (2.12.2), построенными вместе с последними источниками всех его зависимостей (Zlib, Bzip, cURL, PCRE, ReadLine, IDN2, iConv, Unistring и т.д.).

Оказывается, libreadline давал проблемы GnuPG:

$ gpg --version
gpg: symbol lookup error: /usr/local/lib/libreadline.so.7: undefined symbol: UP

И, конечно, попытка получить полезную информацию из Git с -vvv не удалась, поэтому сбой был загадкой.

Чтобы устранить ошибку PGP из-за ReadLine, следуйте инструкциям в Невозможно обновить или использовать диспетчер пакетов - ошибка gpg:

В терминале:

ls /usr/local/lib

там была куча readline libs (libreadline.so.BLAH-BLAH) поэтому i:

su
mkdir temp
mv /usr/local/lib/libreadline* temp
ldconfig

Ответ 19

Ответы выше отличные, но у меня они не сработали. Что решило мою проблему, так это экспорт открытых и секретных ключей.

перечислите ключи с машины, с которой мы экспортируем

$ gpg --list-keys
/home/user/.gnupg/pubring.gpg
--------------------------------
pub 1024D/ABCDFE01 2008-04-13
uid firstname lastname (description) <[email protected]>
sub 2048g/DEFABC01 2008-04-13

экспортировать ключи

$ gpg --output mygpgkey_pub.gpg --armor --export ABCDFE01
$ gpg --output mygpgkey_sec.gpg --armor --export-secret-key ABCDFE01

перейти к машине, которую мы импортируем и импортировать

$ gpg --import ~/mygpgkey_pub.gpg
$ gpg --allow-secret-key-import --import ~/mygpgkey_sec.gpg

Бинго Бонго, все готово!

ссылка: https://www.debuntu.org/how-to-importexport-gpg-key-pair/

пс. Мои ключи изначально были сделаны в bootcamp windows 7, и я экспортировал их на свой Mac Air (одна и та же физическая машина, виртуально другая)

Ответ 20

Ни один из вышеперечисленных ответов, похоже, не соответствовал моей проблеме. Мой gpg двоичный (/usr/local/bin/gpg -> /usr/local/MacGPG2/bin/gpg2) был установлен как часть GPG Suite, а не brew.

Тем не менее, я чувствовал, что совет сводился к: "использовать, что бы gpg бинарно было последним доступным на brew". Поэтому я попробовал:

brew update
brew upgrade git
brew install gpg

# the following are suggestions from brew Caveats, to make `/usr/local/bin/gpg`
# point to the brew binary:
rm '/usr/local/bin/gpg'
brew link --overwrite gnupg2

Я проверил, что я правильно изменил gpg на мой $PATH, чтобы указать на новый исполняемый файл из brew:

🍔 which gpg
/usr/local/bin/gpg
🍔 ls -l /usr/local/bin/gpg
lrwxr-xr-x  1 burger  admin  33 Feb 13 13:22 /usr/local/bin/gpg -> ../Cellar/gnupg2/2.0.30_3/bin/gpg

И я также прямо сказал git, что gpg binary использовать:

git config --global gpg.program gpg

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

В любом случае: этого не было достаточно, чтобы git commit снова успешно подписал мои фиксации.


Вещь, которая работала для меня в конечном счете, заключалась в том, чтобы обновить GPG Suite. Я запускал версию 2016.7, и я обнаружил, что обновление до 2016.10 исправило проблему для меня.

Я открыл GPG Keychain.app и нажал "Проверить наличие обновлений...". С новой версией: подписанные коммиты снова работали правильно.

Ответ 21

установил это просто:

brew uninstall gpg 

brew install gpg2

Ответ 22

Очень похоже на @birchlabs, после долгих поисков и поисков я обнаружил, что это не GPG, а GPG Suite. Я сделал cask reinstall gpg-suite и он решил это за меня.

Ответ 23

Я на Ubuntu 18.04 и получил ту же ошибку, беспокоился также в течение нескольких недель. Наконец понял, что gpg2 ни на что не указывает. Так просто беги

git config --global gpg.program gpg

И тада, это работает как шарм.

Signed commit

Ваши коммиты теперь будут подтверждены тегом с ними.

Ответ 24

Если это произошло случайно и отлично работает в прошлом, как и в моем случае, попробуйте выйти из системы (cmd+shift+q) и войти в систему. Работал для меня

Ответ 25

В моем случае ни одно из решений, упомянутых в другом ответе, не сработало. Я обнаружил, что проблема была специфична для одного хранилища. Удаление и клонирование репо снова решило проблему.

Ответ 26

Я наткнулся на эту ошибку не из-за проблем с конфигурацией, а потому, что срок действия моего ключа истек. Самый простой способ продлить срок его действия в OSX - открыть приложение GPG Keychain (если оно у вас установлено), и оно автоматически предложит вам его продлить. Два клика, и все готово. Надеюсь, это поможет коллегам по Google :)

Ответ 27

Я видел похожие ответы, но ничего похожего на то, что у меня сработало. В Linux мне пришлось убить и перезапустить gpg-agent с помощью:

$ pkill gpg-agent
$ gpg-agent --daemon
$ git commit ...

Это помогло мне. Похоже, вам нужно настроить user.signingkey на ваш личный ключ, а также то, что говорят некоторые другие комментарии.

Ответ 28

Что-то странное, но убедитесь, что ваш терминал достаточно большой! Вы можете определить, слишком ли он мал, запустив echo test | gpg --clearsign - он даст вам довольно очевидное сообщение об ошибке, сообщающее вам. Если он недостаточно велик, ваш агент GPG не сможет отобразить свой маленький блок ncurses.

Это не будет применяться, если вы используете агент с графическим интерфейсом или что-то, что не использует ncurses.

Ответ 29

Это начало происходить внезапно для меня в Ubuntu, не уверен, что какое-то недавнее обновление сделало это, но ни одна из существующих проблем не была применима для меня (я установил GPG_TTY, попытался убить агента и т.д.). Автономная команда gpg не выполнена с этой ошибкой:

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

test
gpg: signing failed: Operation cancelled
gpg: [stdin]: clear-sign failed: Operation cancelled

Я попытался запустить gpg с опцией --debug-all и заметил вывод ниже:

gpg: DBG: chan_3 <- INQUIRE PINENTRY_LAUNCHED 27472 gnome3 1.1.0 /dev/pts/6 screen-256color -
gpg: DBG: chan_3 -> END
gpg: DBG: chan_3 <- ERR 83886179 Operation cancelled <Pinentry>
gpg: signing failed: Operation cancelled

Вышеуказанное указывает на наличие проблемы с программой pinentry. Gpg обычно запускает pinentry-curses для меня, поэтому я изменил его pinentry-tty (сначала мне пришлось установить aptitude), и ошибка исчезла (хотя я больше не получаю ввод пароля в полноэкранном режиме, но в любом случае мне это не нравится), Чтобы внести это изменение, мне пришлось добавить строку pinentry-program /usr/bin/pinentry-tty в ~/.gnupg/gpg-agent.conf и убить агента с помощью gpgconf --kill gpg-agent (он будет перезапущен в следующий раз).

Ответ 30

В OS X, используя gnupg2 через brew, мне просто нужно было убить gpg agent, иногда это происходит:

pkill -9 gpg-agent

И установите переменную env, если необходимо:

export GPG_TTY=$(tty)

См. также общие проблемы GPG и здесь.