GPG ロック問題による Git コミットエラーの解決方法
問題概要
Git でコミットを実行する際に、以下のエラーメッセージが表示され、操作がストップする問題が発生します:
gpg: Note: database_open 134217901 waiting for lock (held by 9857) ...
[GNUPG:] FAILURE sign 134250628
gpg: signing failed: Operation timed out
特に次の特徴が確認されます:
- GPG がロックファイルを待ち続けてタイムアウト
- R 環境やターミナル上で繰り返し発生
- リポジトリのクローンや認証情報リセットでも解消しない
--list-keys
コマンドでも同じロック状態が再現
根本原因
ロック問題の主な原因は以下のいずれかです:
- GPG ロックファイルの残留: 前回の異常終了などでロックファイルが解放されていない
- プロセス競合: 複数のプロセスが同時に同じロックを要求してデッドロック発生
- gpg-agent の異常: バックグラウンドプロセスが期待通りに動作せずロックが解放されない
解決策:ロックファイルの手動削除
推奨度: ★★★★☆(最も信頼性が高い)
1. 関連プロセスの終了
まずアクティブな GPG 関連プロセスをすべて停止:
bash
# 全 gpg プロセスの終了
gpgconf --kill all
# ロックを保持している可能性のあるプロセスを終了
kill -9 9857 # エラーメッセージの PID (例: 9857) を指定
2. ロックファイルの削除
ロックファイルを直接削除します:
bash
# GPG 設定ディレクトリに移動
cd ~/.gnupg
# ロックファイルの確認と削除
rm -f ./*.lock
3. コミット再試行
ロックファイル削除後に通常の git 操作を再開:
bash
git commit -m "Your commit message"
git push
確認ポイント
- 作業前に
lsof | grep .gnupg
でロックファイルを使用中のプロセスがないか確認 - 削除後も問題続く場合は
~/.gnupg
ディレクトリ全体の再作成を検討
代替解決策:GPG 署名の無効化
推奨度: ★★☆☆☆(一時的な回避策として)
コミットに GPG 署名が必須でない場合の簡易回避策:
bash
# 現在のリポジトリ設定変更
git config commit.gpgsign false
# グローバル設定変更(すべてのリポジトリに適用)
git config --global commit.gpgsign false
注意点
この方法はセキュリティ設定を変更するため:
- チームポリシーで署名必須の場合は不適切
- 根本解決ではないため、GPGS署名が必要な環境では他の方法を選択
根本的な予防策
ロック競合の防止
- 同時操作の回避: IDEとCLIなど複数の方法で同時にGit操作しない
- gpg-agentの設定最適化:bash
# ~/.gnupg/gpg-agent.conf 作成 echo "max-cache-ttl 86400" >> ~/.gnupg/gpg-agent.conf echo "default-cache-ttl 3600" >> ~/.gnupg/gpg-agent.conf gpgconf --reload gpg-agent
定期的なメンテナンス
bash
# ロックファイル存在チェックスクリプト例
if [ -f ~/.gnupg/*.lock ]; then
echo "残留ロックファイルを検出、クリーンアップします"
rm -f ~/.gnupg/*.lock
fi
R環境での対策
RStudio を使用している場合:
- [Tools] > [Global Options] > [Git/SVN] を開く
- [Commit時にGPG署名] オプションを無効化
- コンソールではなくR端末で操作する場合はセッション再起動
トラブルシューティングフロー
この手順でほとんどのロック関連の問題は解決します。環境再起動や GPG バージョンアップも有効な場合があります。