当我使用 Git 签署提交时,它总是要求我输入密码来解锁我的密钥。
git commit -S -m 'message'
我该如何将密码存储在缓存中,以便在签署提交时无需每次输入密码
Git无法获取到GnuPG的密钥密码。您必须依靠GnuPG缓存密码的功能,这是通过编辑~/.gnupg/gpg-agent.conf
(在Windows中通常隐藏在AppData
文件夹中)来实现的。
将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
,但请了解此方法的限制和安全性影响(它涉及将您的密码存储在某个明文位置)。
完整的选项列表在此处。
~/.gnupg/gpg-agent.conf
这个文件,但是我有 ~/.gnupg/gpg.conf
,在这个文件里设置 default-cache-ttl
可以吗? - pokemongpg-agent.conf
的。您是否已安装gpg-agent
(which gpg-agent
应列出一个条目)?否则,只需创建一个新文件并设置这些选项。 - Jens Eratgpg2
),可能会更好,因为就在几天前有一个关于此问题的提问。 - Jens Erat更新到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 "$@"
在gnome-keyring中为$GPGKEY设置您的密码短语:
secret-tool store --label='GPG密钥密码短语' gpgpassphrase $GPGKEY
告诉git使用脚本:
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
),它们不再显示为有效。最后我删除了git配置中的设置。事实证明我遇到的问题可能与首次使用该设置有关(我以前使用该设置解决了不同的问题)。
因此,简而言之,在更新后运行git config --global --unset gpg.program
就是解决我的问题的答案。
gpg-agent
并配置default-cache-ttl
选项以及max-cache-ttl
来缓存你的密码。 - miqh