Почему я должен убить gpg-agent для подписания моих коммитов?

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

$ git commit

You need a passphrase to unlock the secret key for
user: "John Doe <[email protected]>"
4096-bit RSA key, ID ABCD1234, created 2016-04-08

gpg: problem with the agent - disabling agent use
error: gpg failed to sign the data
fatal: failed to write commit object

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

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

Ответ 1

Я просто понял, как использовать gpg-agent на моем Mac сегодня. Я был заблокирован после попадания той же ошибки, что и вы:

gpg: problem with the agent - disabling agent use

TL;DR; Как я исправил его

Для моей установки я смог исправить это, установив pinentry-mac и указав gpg-agent, чтобы использовать его, тем самым вызывая приглашение GUI по мере необходимости.

1. install pinentry-mac
% brew install pinentry-mac
2. update gpg-agent conf
# manually change ~/.gnupg/gpg-agent.conf pinentry-program to /usr/local/bin/pinentry-mac
3. update shell view of PATH contents
% hash -r
4. restart gpg-agent
# however you normally do it (see below for how I run it manually)

Подробности по отладке

Я отлаживал это, перезапустив gpg-agent вручную. Сначала я прокомментировал конфигурации в ~/.gnupg/gpg-agent.conf, затем я запустил эту команду, чтобы перезапустить gpg-agent с помощью --verbose:

% killall gpg-agent && \
  eval $(gpg-agent --pinentry-program /usr/local/bin/pinentry --default-cache-ttl 60 --daemon --verbose)

Затем я запустил тестовую команду и увидел ошибку, указанную выше, а также новую:

# update the MY_GPG_KEY_ID as appropriate
% echo hi | gpg -e -r $(MY_GPG_KEY_ID) | gpg -d --use-agent
...
gpg-agent[60604]: command get_passphrase failed: Device not configured
gpg: problem with the agent - disabling agent use
...

В конце концов я понял (после прочтения этой статьи и этой страницы GPG), что GPG_TTY не был установленном шагами, которые я выполнял для запуска gpg-agent. Поэтому, как только я установил эту переменную, все "сработало":

% killall gpg-agent && \
  eval $(gpg-agent --pinentry-program /usr/local/bin/pinentry --default-cache-ttl 60 --daemon --verbose)
% export GPG_TTY=`tty`
# Now the below command succeeds
% echo hi | gpg -e -r $(MY_GPG_KEY_ID) | gpg -d --use-agent

В разгар этого упражнения я пробовал много разных опций и обнаружил, что "tpl2" GUI "только что сработал".

Избегание прошивки с фреймворком графического интерфейса

Если вы не хотите, чтобы всплывающее объявление GUI появилось, я думаю, что достаточно убедиться, что в каждом терминале установлены следующие переменные env:

  • GPG_TTY
    • Например, вы можете поместить эту строку в свой .bashrc:
    • export GPG_TTY=$(tty)
  • GPG_AGENT_INFO