Запретить 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

Просто сделал мою жизнь проще!