防止 git 在签署提交时要求输入 GnuPG 密码

60

当我使用 Git 签署提交时,它总是要求我输入密码来解锁我的密钥。

git commit -S -m 'message'

我该如何将密码存储在缓存中,以便在签署提交时无需每次输入密码


2
你可以设置gpg-agent并配置default-cache-ttl选项以及max-cache-ttl来缓存你的密码。 - miqh
我正在寻找一种使用git的方法来完成它,例如git密码缓存。 - pokemon
3个回答

49

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,但请了解此方法的限制和安全性影响(它涉及将您的密码存储在某个明文位置)。

完整的选项列表在此处


2
我没有 ~/.gnupg/gpg-agent.conf 这个文件,但是我有 ~/.gnupg/gpg.conf,在这个文件里设置 default-cache-ttl 可以吗? - pokemon
1
不,这些选项是专门针对gpg-agent.conf的。您是否已安装gpg-agentwhich gpg-agent应列出一个条目)?否则,只需创建一个新文件并设置这些选项。 - Jens Erat
是的,我已经安装了gpg-agent,但它不起作用,无论是在gpg-agent.conf文件中还是在gpg.conf文件中。顺便说一下,我正在使用Ubuntu gnome 16.04,你确定这种方法适用于它吗? - pokemon
是的,这应该可以。如果您配置git使用GnuPG 2(gpg2),可能会更好,因为就在几天前有一个关于此问题的提问。 - Jens Erat
1
请不要在跟进评论中提出新问题,请提出一个新的问题。 - Jens Erat
显示剩余2条评论

6

GitHub 网站提供以下工具,可帮助你存储 GPG 密钥口令,免去每次签署提交时输入口令的麻烦:

  • Mac 用户可使用 GPG Suite将 GPG 密钥口令存储在 Mac OS Keychain 中。
  • Windows 用户可使用 Gpg4win 与其他 Windows 工具进行集成。

你也可以手动配置 gpg-agent 来保存 GPG 密钥口令,但这种方法不像 ssh-agent 那样与 Mac OS Keychain 集成,而且需要进行更多的设置。


5

更新到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就是解决我的问题的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接