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 = abc.def@gmail.com
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, идентификатор AAAAAAAA, создан 2016-07-01
ошибка: gpg не смог подписать данные фатально: не удалось записать объект коммита
Примечание. Я все еще могу зафиксировать изменения, используя git commit -a -m "message"
Есть ли способ преодолеть то же самое? Или любые изменения, необходимые в gpg
конфиги ладить с обновлением git?
Обновление 1
Также ищите дополнительную полезность, следуя следующим инструкциям. Есть ли способ "автоматического подписания" коммитов в Git с помощью ключа GPG?, Я уже настроил ключ, используя
git config --global user.signingkey ED5CDE14(with my key)
git config --global commit.gpgsign true
и, очевидно, все равно получаю ту же ошибку.
52 ответа
Я столкнулся с этой проблемой с 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's 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 для последнего коммита.
Если используются gnupg2 и gpg-agent 2.x, обязательно установите переменную окружения GPG_TTY
,
export GPG_TTY=$(tty)
Смотрите документацию GPG об общих проблемах.
Если все не удается, используйте 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
Теперь выполните неудачную команду вручную:
$ gpg -bsau 23810377252EF4C2
gpg: skipped "23810377252EF4C2": Unusable secret key
gpg: signing failed: Unusable secret key
Оказывается, мой ключ истек, мерзавец не был виноват.
Следуйте приведенному ниже URL-адресу, чтобы настроить подписанный коммит https://help.github.com/en/articles/telling-git-about-your-signing-key
если по-прежнему получать gpg не удалось подписать данные фатально: не удалось записать объект фиксации
это не проблема с Git, это с GPG, выполните следующие шаги
1.gpg --version
echo "test" | gpg --clearsign
если это показывает:
gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
- затем используйте
export GPG_TTY=$(tty)
4. затем снова попробуйте echo "test" | gpg --clearsign
в котором получена подпись PGP.
git config -l | grep gpg
gpg.program = gpg commit.gpgsign = true
6.apply git commit -S -m "commitMsz"
Я СДЕЛАН это через этот короткий и легкий рецепт:
Автоматическая подпись коммитов в 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
Может помочь процесс убийства gpg-agent
это может застрять со старыми данными. Так новый gpg-agent
начал бы попросить пароль
Любой, кто сталкивается с этой проблемой на компьютерах MacOS, попробуйте это:
brew uninstall gpg
brew install gpg2
brew install pinentry-mac
(если нужно)gpg --full-generate-key
Создайте ключ с помощью алгоритма.- Получить сгенерированный ключ, выполнив:
gpg --list-keys
- Установите ключ здесь
git config --global user.signingkey <Key from your list>
git config --global gpg.program /usr/local/bin/gpg
git config --global commit.gpgsign true
- Если вы хотите экспортировать свой ключ в GitHub, то:
gpg --armor --export <key>
и добавьте этот ключ в GitHub в ключах GPG: https://github.com/settings/keys (с включенной строкой 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 (убедитесь, что адрес электронной почты и имя совпадают с тем, который вы создали при создании ключа):
[user]
email = gent@youremail.com
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
Мои два цента здесь:
Когда вы создаете и добавляете ключ в gpg-agent, вы определяете что-то под названием passphrase
, Теперь, когда passphrase
в какой-то момент истекает, и gpg
вам нужно ввести его снова, чтобы разблокировать ключ, чтобы вы могли снова начать подписывать.
Когда вы используете любую другую программу, которая взаимодействует с gpg
, gpg
подсказок к вам ввести ваш пароль не появляется (в основном gpg-agent
когда демон не может показать диалоговое окно ввода в stdin
).
Одним из решений является gpg --sign a_file.txt
затем введите фразу-пароль, которую вы ввели при создании ключа, и тогда все должно быть в порядке (gpg-agent
должен автоматически подписаться)
Посмотрите этот ответ о том, как установить более длительные тайм-ауты для вашей парольной фразы, чтобы вам не приходилось делать это все время.
Или вы можете полностью удалить пароль с ssh-keygen -p
Я видел похожие ответы, но ничего похожего на то, что у меня сработало. В Linux мне пришлось убить и перезапустить мой gpg-agent
с участием:
$ pkill gpg-agent
$ gpg-agent --daemon
$ git commit ...
Это помогло мне. Похоже, вам нужно иметь user.signingkey
установить на ваш личный ключ, а также из того, что говорят другие комментарии.
Я получаю эту ошибку каждый раз, когда выхожу из системы, а затем снова вхожу в систему на моем MacOS. Решение просто простая единственная команда:
killall gpg-agent
Думаю, это просто ошибка агента gpg, убей его потом снова работай.
В OS X с помощью gnupg2
через brew мне просто пришлось убить агента gpg, иногда случается:
pkill -9 gpg-agent
И установите env
при необходимости переменная:
export GPG_TTY=$(tty)
См. Также Общие проблемы GPG и этот ответ.
Этот мерзавец был очень показателен для моей ситуации...
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 'First Last <first.last@domain.com>'
error: gpg failed to sign the data
fatal: failed to write commit object
Мне нужно было сгенерировать начальный ключ в соответствии с форматом, который проверял git.
gpg --quick-generate-key "First Last <first.last@domain.com>"
Тогда это сработало.
И не забудьте заменить свое имя и адрес электронной почты вместо "First Last <first.last@domain.com>"
Надеюсь, это поможет.
Обновление октябрь 2016: в выпуске 871 упоминается "Подпись перестала работать в Git 2.9.3"
Git для Windows 2.10.1, выпущенный два дня назад (4 октября 2016 г.), исправил подпись Interactive GPG о коммитах и тегах.
Недавнее изменение знака gpg в git (которое не создает проблем в Linux) выявляет проблему в том, как в Windows не-MSYS2-git взаимодействует с MSYS2-gpg.
Оригинальный ответ:
Чтение " 7.4 Git Tools - Подписание вашей работы ", я полагаю, у вас есть " user.signingkey
"Конфигурация установлена.
Последний большой рефакторинг (перед Git 2.10) вокруг gpg был в коммите 2f47eae2a, здесь это сообщение об ошибке было перемещено в gpg-interface.c
Журнал в этом файле показывает недавнее изменение в коммите af2b21e (Git 2.10)
По умолчанию gpg2 уже использует длинный формат, но в большинстве дистрибутивов, по-видимому, все еще используется "gpg" более старой версии 1.x из-за соображений совместимости. И более старые версии gpg показывают только 32-битный короткий идентификатор, что довольно небезопасно.
На самом деле это не имеет значения для самой проверки: если проверка прошла успешно, подпись pgp хороша.
Но если у вас еще нет ключа и вы хотите его получить, или вы хотите точно проверить, какой ключ использовался для проверки, и хотите его проверить, мы должны указать ключ с большей точностью.
Итак, проверьте, как вы указали свой user.signingkey
Конфигурация и версия gpg, которую вы используете (gpg1 или gpg2), чтобы увидеть, влияют ли они на сообщение об ошибке.
Существует также коммит 0581b54, который изменяет условие для gpg failed to sign the data
сообщение об ошибке (в дополнение к коммиту 0d2b664):
Мы вообще не читаем из stderr. Тем не менее, мы захотим сделать это в будущем патче, так что это также подготовит нас к этому (и в этом случае gpg пишет перед чтением всех входных данных, хотя, опять же, маловероятно, что ключевой идентификатор заполнит буфер канала).
В коммите 4322353 показано, что gpg теперь использует временный файл, поэтому возможны проблемы с этим.
Давайте перейдем к использованию объекта tempfile, который обрабатывает сложные случаи для нас, и добавим отсутствующий вызов очистки.
Я получил эту ошибку на Ubuntu 18.04, и оказалось, что мой ключ истек.
Чтобы увидеть это, я запустил это и подтвердил, что срок действия моих ключей истек:
gpg --list-keys
Чтобы исправить это, я запустил (используя идентификатор, показанный в предыдущей команде):
gpg --edit-key <ID>
Оттуда я продлил срок действия key 0
а также key 1
следуя этим инструкциям, которые сводились к печатанию key 0
тогда expire
и следуя подсказкам. Затем повторяя key 1
,
Затем, чтобы проверить это, я побежал:
echo test | gpg --clearsign
И до исправления произошел сбой с ошибкой:
gpg: нет секретного ключа по умолчанию: нет секретного ключа
gpg: [stdin]: сбой при очистке: нет секретного ключа
Но после исправления та же команда успешно подписала сообщение, так что я знал, что все снова работает!
Используя cygwin, я недавно переключился на gpg2
, Тогда у меня была такая же проблема для подписи с помощью git после установки git config gpg.program gpg2
,
Пытаться echo "test" | gpg2 --clearsign
чтобы увидеть, работает ли gpg2. Я нашел это самое простое решение просто установить git config gpg.program gpg
, потому что это работает. Но вы также получите лучшую ошибку - например, вам нужно установить pinentry.
Если вы используете homebrew на микросхеме M1 без Rosetta, вам необходимо указать другое местоположение двоичного файла pinentry-program, потому что он установлен в другом месте.
Обновленный ответ Энди Хайдена следует изменить следующим образом:
brew upgrade gnupg # This has a make step which takes a while
arch -arm64 brew link --overwrite gnupg
arch -arm64 brew install pinentry-mac
echo "pinentry-program /opt/homebrew/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
killall gpg-agent
Может быть, зависший gpg-агент.
Пытаться gpgconf --kill gpg-agent
как обсуждено здесь
Я использую M1 Mac , где я пробовал самые распространенные решения и не работал, моя проблема заключалась в том, что здесь отсутствует двоичный файл GPG =>
usr/local/bin
Первоначально я установил GPG через
brew
и я попытался переустановить его, но не смог найти двоичный файл, в котором он хранится, позже я установил графический интерфейс GPG Suite отсюда => Инструменты GPG Suite , и это сработало.
Наконец, я могу войти в коммит и получить значок подтверждения на Github.
Я, должно быть, как-то случайно обновил 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
исправил это для меня.
Надеюсь, это кому-нибудь поможет.
Я наткнулся на эту ошибку не из-за проблем с конфигурацией, а потому, что срок действия моего ключа истек. Самый простой способ продлить срок его действия в OSX - открыть приложение GPG Keychain (если оно у вас установлено), и оно автоматически предложит вам его продлить. Два клика, и все готово. Надеюсь, это поможет коллегам по Googles:)
Я столкнулся с той же проблемой. Я рад сообщить, что проблема заключается не в git 2.10.0
но с gnupg 1.4.21
,
Временное понижение версии gnupg до 1.4.20 исправило проблему для меня.
Если вы используете homebrew и обновили свои пакеты, как я, вы можете просто запустить brew switch gnupg 1.4.20
вернуться назад.
В моем случае проблема была с относительным именем внутри
~/.gitconfig
. Я изменил его на это, и проблема исчезла (Монтерей, Macbook M1):
[gpg]
program = /opt/homebrew/bin/gpg
Объяснение простое: когда
git
пытается запустить, он делает это в новой оболочке, не запуская
~/.profile
где я настраиваю
PATH
для домашнего пивоварения. Так просто не найти
gpg
вообще.
Мне было очень полезно проверить, чтоgit commit
делает под капотом. Запустите следующую фиксацию сGIT_TRACE=1
следующим образом:
GIT_TRACE=1 git commit -S -m "MESSAGE"
Это покажет, какое имя пользователя, адрес электронной почты и ключ подписи использует git при фиксации.
В моем случае я обнаружил, что git собирал неправильные данные о пользователе и ключе для подписания коммита. В основном я намеревался использовать локальную конфигурацию репо, а не глобальную, и добавив следующее в локальную конфигурацию git (расположенную в «REPO_PATH/.git/config»), подписал фиксацию для работы как в Терминале, так и в VSCode.
[user]
name = USER NAME
email = USER EMAIL
signingKey = SIGNING KEY
Его также можно установить с помощью следующего:
git config --local user.name "USER NAME"
git config --local user.email "USER EMAIL"
git config --local user.signingkey "USIGNING KEY"
Убедитесь, что ваш адрес электронной почты настроен правильно.
git config --global user.email "user@example.com"
После долгих поисков я обнаружил, что в моем случае проблема заключалась в ключе gpg.
Чтобы проверить, является ли ключ gpg проблемой для вас, сначала проверьте вывод следующего:
GIT_TRACE=1 git commit -m 'message'
Если что-то не так, вы увидите что-то вроде:
10:37:22.346480 run-command.c:637 trace: run_command: gpg --status-fd=2 -bsau <your GPG key>
Здесь показывалось мое имя и адрес электронной почты в ключе GPG, но здесь должен быть ключ. Вы можете попробовать запустить
gpg --status-fd=2 -bsau <your GPG key>
Чтобы обновить правильный ключ, сделайте следующее: проверьте ключ, используя:
gpg --list-secret-keys --keyid-format=long
Он должен иметь следующий вывод:
/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec 4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid Hubot
ssb 4096R/42B317FD4BA89E7A 2016-03-10
А затем обновите ключ, используя:
git config --global user.signingkey 3AA5C34371567BD2
Теперь снова проверьте фиксацию, и она должна быть успешной, если проблема была в ключе. Вам нужно установить парольную фразу для обновления ключа, что вы можете сделать с помощью документации GitHub.
Более подробная информация находится по адресу: https://gist.github.com/paolocarrasco/18ca8fe6e63490ae1be23e84a7039374 .
Если электронная почта, связанная с uid вашего ключа GPG, отличается от электронной почты, которую вы используете в git, вам нужно добавить другой идентификатор пользователя в ваш ключ ИЛИ использовать ключ, который точно соответствует электронной почте.
Вы можете добавить другой UID, используя:
$ gpg --edit-key
См. Мо https://superuser.com/questions/293184/one-gnupg-pgp-key-pair-two-emails
Ответы выше отличные, но у меня они не сработали. Что решило мою проблему, так это экспорт как открытых, так и секретных ключей.
перечислите ключи с машины, с которой мы экспортируем
$ gpg --list-keys
/home/user/.gnupg/pubring.gpg
--------------------------------
pub 1024D/ABCDFE01 2008-04-13
uid firstname lastname (description) <email@example.com>
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 (один и тот же физический компьютер, виртуально другой)
Ничего из вышеперечисленного у меня не сработало, я обычно использую свой терминал IDE.
У меня время от времени возникала эта ошибка, в большинстве случаев она работала нормально. Я обнаружил проблему после запуска
echo "test" | gpg --clearsign
gpg: signing failed: Screen or window too small
gpg: [stdin]: clear-sign failed: Screen or window too small
Решение: просто увеличьте размер окна терминала.
Помимо неправильной настройки ключа gpg с помощью git, возможна еще одна проблема: попытка выполнить фиксацию изнутри сеанса ssh с перенаправлением X. В этом случае он может попытаться вызвать графический интерфейс, который не удастся, если env var
DISPLAY
не установлен.
Вы можете заставить gpg-agent использовать инструмент только для tty, отредактировав свой
~/.gnupg/gpg-agent.conf
:
pinentry-program /usr/bin/pinentry-tty
Затем перезагрузите конф:
gpg-connect-agent reloadagent /bye
(конечно, сначала установите pinentry-tty)
Это начало происходить внезапно для меня в 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 install
это сначала), и ошибка исчезла (хотя я больше не получаю полноэкранный ввод пароля, но мне это все равно не нравится). Чтобы внести это изменение, мне пришлось добавить строкуpinentry-program /usr/bin/pinentry-tty
к ~/.gnupg/gpg-agent.conf
и убить агента с помощью gpgconf --kill gpg-agent
(он будет перезапущен в следующий раз).