Gitでerror: gpg failed to sign the dataと出てコミットできないときの対処法

## 問題
`git commit -S -m "commit message"`したところ、以下のようなエラーが出た。

```
error: gpg failed to sign the data
fatal: failed to write commit object
```

## 対処法
### (0. そもそもGPG鍵を生成した覚えがない方へ)
「そもそもGPGって何？そんなもの生成した覚えない」という方は以下の記事が参考になると思う。

https://qiita.com/cocoabreak/items/d96cd0ba56cdcbf62d32


### 1. 鍵のIDを調べる
まず、`gpg --list-secret-keys --keyid-format LONG`でssbのIDを調べる。このとき、

```
ssb   rsa2048/67983FDC1DEBDACB 2021-02-06 [S]
ssb   rsa2048/67983FDC1DEBDACB 2021-02-06 [SE]
```
のように[ ]内に"S"が含まれた鍵を選ぶようにする。そのような鍵がない場合は[ステップ2](#2-usageフラグを編集する)へ、ある場合は[ステップ3](#3-gitにgpgキーを追加)に飛ぶ。


### 2. Usageフラグを編集する
GPGキーの利用法(Usage)フラグが誤っているので、修正するか新しく鍵を作り直す。

修正する場合は以下のようにする。名前などは適宜読み替えてほしい。
実際に入力する行の頭には米印をつけている。


```shell
※$ gpg --edit-key キーに設定した名前(Real name)
gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available

sec  rsa2048/4D08708603E2AC85
     created: 2021-02-06  expires: 2023-02-06  usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa2048/67983FDC1DEBDACB
     created: 2021-02-06  expires: 2023-02-06  usage: E
[ultimate] (1). goahi <goai@protonmail.com>

※gpg> key 1

sec  rsa2048/4D08708603E2AC85
     created: 2021-02-06  expires: 2023-02-06  usage: SC
     trust: ultimate      validity: ultimate
ssb*  rsa2048/67983FDC1DEBDACB
     created: 2021-02-06  expires: 2023-02-06  usage: E
[ultimate] (1). goahi <goai@protonmail.com>

※gpg> change-usage
Changing usage of a subkey.

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Encrypt

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished

※Your selection? s

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Sign Encrypt

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished

※Your selection? q

sec  rsa2048/4D08708603E2AC85
     created: 2021-02-06  expires: 2023-02-06  usage: SC
     trust: ultimate      validity: ultimate
ssb*  rsa2048/67983FDC1DEBDACB
     created: 2021-02-06  expires: 2023-02-06  usage: SE
[ultimate] (1). goahi <goai@protonmail.com>

※gpg> save
```

この段階で一度`git commit -S -m "commit message"` でコミットできるか試してみる。無事コミットできたら終了。失敗したら次のステップへ。

###  3. GitにGPGキーを追加
```
ssb   rsa2048/67983FDC1DEBDACB 2021-02-06 [SE]
```
例えばこの場合、`67983FDC1DEBDACB`の部分がIDとなる。
Gitに`git config --global user.signingkey <鍵のID>`でGPG鍵を追加する。ここまででコミットできるようになっているはず。

### 4. それでもコミットできないとき(一部のLinux環境)
`~/.zshrc`や`~/.bashrc`など使用するシェルの設定ファイルに以下を追記してターミナルを再起動する。また、これを追記してもVSCodeからターミナルを利用するとコミットできないことがあるので、その際はターミナルを直接起動する。

```sh
export GPG_TTY=$(tty)
```

## 参考記事
- [How to solve gpg: bad data signature from key: KEY_ID Wrong key usage (0x19, 0x2)](https://unix.stackexchange.com/questions/458870/how-to-solve-gpg-bad-data-signature-from-key-key-id-wrong-key-usage-0x19-0x2)
- [GitHub / GitLab用にコミット署名を行うための準備メモ](https://qiita.com/cocoabreak/items/d96cd0ba56cdcbf62d32)
- [欅樹雑記: GitHubでVerifiedマーク](https://blog.zelkova.cc/2019/08/digital-signature-for-github.html)