Gitは、を使用してコミットに署名するときに、秘密鍵のロックを解除するためのパスフレーズを入力するように常に要求します。
git commit -S -m 'message'
コミットに署名するたびにパスワードを入力する必要がないように、パスワードをキャッシュに保存するにはどうすればよいですか?
GitがGnuPGパスフレーズを取得することはありません。パスフレーズをキャッシュするGnuPGの機能に依存する必要があります。これは、gpg-agent
(WindowsのAppData
フォルダーのどこかに非表示)を編集することで簡単に設定できる~/.gnupg/gpg-agent.conf
を介して行われます。
default-cache-ttl
を、GnuPGを呼び出すたびにパスフレーズがキャッシュされる秒数に設定します。 maximum-cache-ttl
は、パスフレーズが最初に入力されてからキャッシュが消去される時間を設定します。 ignore-cache-for-signing
が設定されていないことを確認してください。設定されていない場合、GnuPGは署名操作のキャッシュを無視します。
ユーザーの操作なしでコミットに署名する場合は、gpg-preset-passphrase
を介してキャッシュを事前に入力できます。多くの場合、/usr/lib/gnupg2/gpg-preset-passphrase
のような場所のどこかに隠されています。または、任意の復号化または署名操作を実行します。 --passphrase [your passphrase]
のようなオプションを使用してgpg
に渡すようにgitを構成することもできますが、このアプローチの制限とセキュリティへの影響を確認してください(パスフレーズがプレーンテキストのどこかに保存されている必要があります)。
オプションの完全なリストは ここ です。
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='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
)に更新する前に署名した古いコミットを見ると、それらはもはや有効として表示されませんでした。結局、gitconfigのgpg.program
設定を削除しました。私が遭遇した問題は、おそらくそもそもその設定を持っていることに関連していることがわかりました(私は過去に別の問題を回避するために使用しました)。
つまり、git config --global --unset gpg.program
を実行することが、更新後の私の問題に対する答えでした。