Skip to content

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 コマンドでも同じロック状態が再現

根本原因

ロック問題の主な原因は以下のいずれかです:

  1. GPG ロックファイルの残留: 前回の異常終了などでロックファイルが解放されていない
  2. プロセス競合: 複数のプロセスが同時に同じロックを要求してデッドロック発生
  3. 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 を使用している場合:

  1. [Tools] > [Global Options] > [Git/SVN] を開く
  2. [Commit時にGPG署名] オプションを無効化
  3. コンソールではなくR端末で操作する場合はセッション再起動

トラブルシューティングフロー

この手順でほとんどのロック関連の問題は解決します。環境再起動や GPG バージョンアップも有効な場合があります。