Подтвердить что ты не робот

Запретить git запрашивать пароль GnuPG во время подписания фиксации

Гит всегда просит меня ввести кодовую фразу, чтобы разблокировать мой секретный ключ при подписании фиксации.

git commit -S -m 'message'

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

4b9b3361

Ответ 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

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