Запретить git запрашивать пароль GnuPG во время подписания фиксации
Гит всегда просит меня ввести кодовую фразу, чтобы разблокировать мой секретный ключ при подписании фиксации.
git commit -S -m 'message'
Как я могу хранить в кеше пароль, чтобы мне не приходилось вводить его каждый раз при подписании фиксации
Ответы
Ответ 1
Git никогда не получит парольную фразу GnuPG. Вы должны полагаться на возможности GnuPG по кешированию парольных фраз, что происходит через gpg-agent
, которые легко настраиваются путем редактирования ~/.gnupg/gpg-agent.conf
(скрытого где-то в вашей папке AppData
в Windows).
Установите default-cache-ttl
на количество секунд, в течение которых парольная фраза кэшируется после каждого вызова GnuPG. maximum-cache-ttl
устанавливает время после первоначального ввода ключевой фразы, когда кэш стирается. Убедитесь, что ignore-cache-for-signing
не установлен - в противном случае GnuPG будет игнорировать кэш для операций подписания.
Если вы хотите подписывать коммиты без какого-либо взаимодействия с пользователем, вы можете предварительно заполнить кеш через gpg-preset-passphrase
, часто скрытый где-то в таком месте, как /usr/lib/gnupg2/gpg-preset-passphrase
; или запустив произвольную операцию дешифрования или подписи. Вы также можете настроить git на использование опции, подобной --passphrase [your passphrase]
, которая будет передана в gpg
, но ознакомьтесь с ограничениями и последствиями для безопасности этого подхода (он подразумевает, что ваша фраза-пароль хранится где-то в открытом тексте).
Полный список опций здесь.
Ответ 2
После обновления до Ubuntu 18.04 все мои предыдущие решения больше не работали, потому что gnome-keyring
больше не реализует агент GPG, и я не мог заставить gpg-agent
кэшировать любую фразу-пароль.
Вот решение, которое наконец-то сработало для меня:
Создайте сценарий gpg-without-tty
:
#!/bin/bash
echo $(secret-tool lookup gpgpassphrase $GPGKEY) | /usr/bin/gpg --batch \
--no-tty --pinentry-mode loopback --passphrase-fd 0 "[email protected]"
Установите пароль для $ GPGKEY в gnome-keyring:
secret-tool store --label='Passphrase for GPG Key' gpgpassphrase $GPGKEY
Скажите git использовать скрипт gpg-without-tty
:
git config --global gpg.program /path/to/gpg-without-tty
Возможно, вам также придется добавить настройку allow-loopback-pinentry
в ~/.gnupg/gpg-agent.conf
.
Обновление: Хотя это работало локально, оказалось, что оно каким-то образом испортило подписи: оно подписало коммиты с полным 40-символьным отпечатком. GitHub не признал эти подписи действительными. И когда я смотрел старые коммиты, которые я подписал перед обновлением до 18.04 (git log --show-signature
), они больше не показывались как действительные. В итоге я удалил настройку gpg.program
в конфиге git. Оказывается, проблемы, с которыми я столкнулся, были, вероятно, связаны с тем, чтобы этот параметр был в первую очередь (который я использовал в прошлом, чтобы обойти другую проблему).
Короче говоря, запуск git config --global --unset gpg.program
стал ответом на мои проблемы после обновления.
Ответ 3
Если вы действительно не хотите или не должны подписывать каждое сообщение, вы можете отключить подписку по умолчанию, выполнив:
git config --global commit.gpgsign false
Если вы хотите подписать коммит, вы можете сделать это, используя флаг -S. Как это..
git commit -S -m your commit message
Просто сделал мою жизнь проще!