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

Я следил за несколькими статьями над довольно атрибуты Git 2.10 примечание к выпуску. Проходя через который обновил git до 2.10.0 и внес изменения в global .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, ID AAAAAAAA, создан 2016-07-01

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

Примечание - я все еще могу совершать изменения с помощью git commit -a -m "message"

есть ли способ преодолеть то же самое? Или любые изменения, необходимые в gpg configs, чтобы получить вместе с обновлением ГИТ?


обновление 1

также ищет дальнейшей полезности, следуя есть ли способ" автосигнализации " коммитов в Git с помощью ключа GPG?. Я уже настроил ключ, используя

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

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

21 ответов


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

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

похоже, что обновление gpg (из brew) изменилось на местоположение gpg to 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 не варить), он предлагает хороший тест:

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

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

теперь вы сможете использовать git signing опять!
Стоит отметить, что вам нужно будет иметь:

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-агент 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

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

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

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


Я сделал это short и легко рецепт:

авто-знак фиксации на MacOS (глобально и с различными IDEs):

получите ваш 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 file (редактировать файл с ):

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

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


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

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

недавнее изменение GPG-sign в 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 тут write перед чтением всех входных данных, хотя опять же, маловероятно, что ключевой uid заполнит буфер канала).

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

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


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

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

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


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

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


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

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

$ gpg --edit-key

см. для mo https://superuser.com/questions/293184/one-gnupg-pgp-key-pair-two-emails


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

git config --global user.email "user@example.com"

у меня была аналогичная проблема с последними источниками 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 error:

В терминала:

ls /usr/local/lib

там была куча библиотек readline (libreadline.Итак.БЛА-БЛА ... ) поэтому я:

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

мои два цента:

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

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

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

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

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


ответы выше велики, но они не работали для меня. То, что решило мою проблему, экспортировало оба общественные и секрет ключи.

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

$ 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/

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


получил его настройку просто:

brew uninstall gpg 

brew install gpg2

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


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

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>"

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


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

gpg binary является последним доступным на brew". Поэтому я попробовал:
brew update
brew upgrade git
brew install gpg

# the following are suggestions from brew's 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

ну, может быть, это не совсем водонепроницаемо, так как оно чувствительно к пути. На самом деле я не зашел так далеко, чтобы подтвердить вне всякого сомнения, что ГИТ переключился на вызов варева gpg.

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


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

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


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


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


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

git config commit.gpgsign false

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

git config -l | grep gpg

если он возвращает true, выполните следующую команду, чтобы отключить его

git config --global --unset commit.gpgsign

после успешного выполнения вышеуказанной команды вы сможете запустить команду git commit.