エラーの内容
VS Code で変更をステージングしてコミットしようとすると、クリーンなコミットの代わりに次のエラーが表示されます:
error: gpg failed to sign the data
fatal: failed to write commit object
ソース管理パネルには汎用的なエラーメッセージが表示されるだけで、パスフレーズの入力プロンプトも、何が問題かのヒントもありません。さらに厄介なことに、通常のターミナルからは同じコミットが問題なく動作することがあります。VS Code の統合ターミナルと GUI コミットフローはしばしば原因となります — これらは常にシェル環境全体を継承するわけではないからです。
発生原因
Git の設定で commit.gpgsign = true を有効にしていると、すべてのコミットに署名が必要になります。これが壊れる原因はいくつかあります:
- GPG エージェントが起動していないか、クラッシュしている
GPG_TTYが設定されていないため、GPG がパスフレーズを要求できない- pinentry プログラムがダイアログを表示できない(VS Code のターミナル環境でよく発生する)
- 設定された署名キーが存在しないか、有効期限が切れている
- macOS の場合:GPG Suite の pinentry-mac が正しく設定されていない
VS Code はこの問題のデバッグをさらに困難にします。統合ターミナルと GUI コミットフローは、シェル環境全体を常に継承するわけではないため、GPG_TTY が未設定のまま、エージェントのソケットも黙って失われてしまうことがあります。
修正方法 1:GPG エージェントを再起動する
まずここから始めましょう。エージェントを終了させ、次の GPG 呼び出し時に再起動させます:
gpgconf --kill gpg-agent
gpg-agent --daemon
再度コミットを試みてください。エージェントがクラッシュしていたり、不正な状態になっていた場合は、このステップだけで解決することが多いです。
修正方法 2:シェルプロファイルに GPG_TTY を設定する
GPG はパスフレーズのプロンプトを表示するために TTY が必要です。VS Code の統合ターミナルでは GPG_TTY が設定されていないことが多く、署名の試みが無音で失敗します。
~/.bashrc、~/.zshrc、または ~/.bash_profile に次の行を追加してください:
export GPG_TTY=$(tty)
シェルをリロードします:
source ~/.zshrc # または ~/.bashrc
新しい VS Code ターミナルを開いて、再度コミットを試みてください。Linux ではこれが最も一般的な修正方法です。
修正方法 3:pinentry-tty に切り替える(Linux)
それでもパスフレーズのダイアログが表示されない場合は、ターミナルベースの pinentry に切り替えましょう。まず、システム上の場所を確認します:
which pinentry-tty
# common paths: /usr/bin/pinentry-tty or /usr/local/bin/pinentry-tty
次に設定してエージェントを再起動します:
echo "pinentry-program /usr/bin/pinentry-tty" >> ~/.gnupg/gpg-agent.conf
gpgconf --kill gpg-agent
Git を操作する前に、GPG を直接テストします:
echo "test" | gpg --clearsign
パスフレーズの入力が求められ、正常に署名できれば、VS Code でのコミットも動作するはずです。
修正方法 4:macOS — pinentry-mac を使用する
macOS では特別な対応が必要です。pinentry-mac がなければ、VS Code のソース管理パネルから呼び出された場合に GPG がダイアログを表示する方法がありません — プロンプトを表示するターミナルが存在しないからです。まずインストールしてください:
brew install pinentry-mac
次に設定を行います:
echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf
gpgconf --kill gpg-agent
この設定後は、GUI からコミットする際でも、ターミナルなしでネイティブの macOS パスフレーズダイアログが表示されるようになります。
修正方法 5:署名キーを確認する
念のため確認しておきましょう:Git に存在しないか有効期限が切れたキーが設定されている可能性があります。まず Git が使用しようとしているキーを確認します:
git config --global user.signingkey
次に GPG が実際に持っているキーを一覧表示します:
gpg --list-secret-keys --keyid-format LONG
次のような出力が表示されます:
sec rsa4096/3AA5C34371567BD2 2021-03-01 [SC]
...
uid Your Name <you@example.com>
sec 行の / の後の値がキー ID です。Git の設定と一致しない場合は更新してください:
git config --global user.signingkey 3AA5C34371567BD2
出力の有効期限も確認してください。期限切れのキーは、署名が再び機能するようになる前に更新または交換する必要があります。
修正方法 6:ターミナルからコミットする(回避策)
GUI のコミットフローが失敗し続ける場合は、それを回避しましょう。統合ターミナルを開いて直接コミットします:
git commit -m "your message"
シェルプロファイルに GPG_TTY が設定されており、エージェントが起動していれば、通常はこれで動作します。VS Code のソース管理パネルが抱えている環境の問題を回避できます。
修正方法 7:GPG 署名を一時的に無効にする
今すぐ変更をリリースする必要がある場合は、このコミットだけ署名をスキップできます:
git commit --no-gpg-sign -m "your message"
または、根本原因をデバッグする間、グローバルに無効にします:
git config --global commit.gpgsign false
GPG の設定が完了したら、再度有効にしてください:
git config --global commit.gpgsign true
修正の確認
完了と判断する前に、簡単なエンドツーエンドの確認を実行してください:
# Confirm GPG can sign and the passphrase prompt works
echo "test" | gpg --clearsign
# Make an empty commit and inspect the signature
git commit --allow-empty -m "test gpg signing"
git log --show-signature -1
git log の出力で次の内容を確認してください:
gpg: Signature made Wed Jul 16 10:00:00 2026 JST
gpg: using RSA key 3AA5C34371567BD2
gpg: Good signature from "Your Name <you@example.com>"
「Good signature」という行が表示されれば成功です。すべてが正しく設定されています。
再発防止策
この問題の再発を防ぐためのいくつかの習慣を紹介します:
- 現在のセッションだけでなく、シェルプロファイルに
export GPG_TTY=$(tty)を永続的に追加する - macOS では pinentry-mac を使用して、GUI ツールを含むすべての場所でパスフレーズダイアログが動作するようにする
- キーの有効期限に注意する:
gpg --list-keysで日付を確認し、更新時にカレンダーリマインダーを設定する - 複数のマシンを使用している場合は、各マシンに GPG キーをインポートする — Git の設定をコピーするだけでは不十分
- 煩わしさを減らしたい場合は SSH 署名を検討する:
git config --global gpg.format ssh

