web-dev-qa-db-ja.com

IntelliJのようなIDE内からgitコミットに署名する方法は?

質問Windows上のIntelliJのようなIDEを使用してgitコミットに署名するにはどうすればよいですか?

興味があるなら、私がここで試したことを読んでください:

主に Githubのガイド に従いました。構成ファイルを変更した後、bash/IntelliJを再起動することを忘れないでください。

  1. 新しいGPGキーペアを生成する
  2. GitHubアカウントにGPGキーを追加します
  3. 検証済みの(GitHubによる)メールをGPGキーに関連付けます ここで、.gitconfigのメールが同じであることを確認しました。
  4. GPGキーについてGitに伝える
  5. GPG でコミットに署名し、Githubで検証済みであることを確認しました。
  6. その同じページから、デフォルトでgit config --global commit.gpgsign trueで署名されるようにコミットを設定します(git 2.12を使用しています)。新しいコミットを作成し、git verify-commit HEADで署名されていることを確認しました
  7. IntelliJでコミットしようとするとgpg: cannot open tty 'no tty'が返されるので、 IntelliJがコミット(GPG) に署名しようとしたときに変更のコミットに失敗し、no-ttyを追加しましたC:\Users\username\.gnupg\gpg.confファイルを再起動しました。

  8. それからエラーgpg: Sorry, no terminal at all requested - can't get inputが表示されますが、これは端末なしで実行するオプションを追加しただけなので合理的です。 gpgのように:申し訳ありませんが、端末はまったく要求されません-入力を取得できません は、解決策はno-ttyを削除することであると言います。

  9. 最初の質問の他の回答では、use-agentgpg.confファイルに追加することを提案しました。これにより、追加のエラーgpg: gpg-agent is not available in this sessionが発生します。ああ、多分私はgpg-agentをセットアップする必要があります。

  10. 私が見つけたWindows向けの最高のガイドは、 Archlinux wiki (そうです)です。 C:/Users/username/.gnupg/gpg-agent.confに生存時間を追加することを指定しているので、そのファイルを作成し、 https://superuser.com/questionsに従ってdefault-cache-ttl 34560000およびmax-cache-ttl 34560000を追加します。/624343/keep-gnupg-credentials-cached-for-for-entire-user-session

  11. さて、実際にこのgpg-agent https://superuser.com/questions/1153101/why-does-git-complain-that-no-gpg-agent-is-running 確かにgpg-agent --versiongpg --versionよりもずっと新しいことを確認したので、git config --global gpg.program gpg2を実行できるようにgpg2が欲しいです。

  12. しかし、コマンドラインでgpg2を使用できません。 Gpg4win (バイナリリリース、下部)とGnupg 2を個別にインストールしましたが、コマンドラインでgpg2が表示されず、GNU私が持っているべきだと思うプログラムファイル(x86)内。 where gpgで、少なくともダウンロードしたばかりのgpgを指していないことがわかりました。そこで、git config --global gpg.program 'C:\Program Files (x86)\GnuPG\bin\gpg.exe'でgitを正しいものに向けました。

  13. エラーgpg: skipped "keyid": secret key not availableが発生しました。 gpg:の解決策は「N」をスキップしました:秘密鍵は利用できません は私がやったことなので、助けにはなりません。それから、私はすべてを他のgpgでセットアップしましたが、これではありませんでした。 alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'"を実行し、gpg --versionをチェックして、すべてを再度実行しました。実際、.bash_profileにエイリアス行を挿入しているので、毎回実行する必要はありません。

  14. gpg --gen-keyを試すとすぐにハングします。理由はわかりませんが、古いgpgは正常に機能したため、問題が十分なエントロピーではないと思いますが、新しいバージョンではより多くのエントロピーが必要になる可能性があります。いずれにせよ、インターネット上で同じ問題を抱えているWindowsユーザーを見つけることができませんでした。

  15. できます! IntelliJでコミットすると、pinentryでパスフレーズを1回だけ要求します。しかし、Git Bashからコミットすることはできません。no secret keyエラーが発生したため、gpg --list-keysは空です。このgpgに関連付けられているキーはありません。

  16. Intellij IDEA GPG でGITコミットに署名することは重要ですが、唯一の答えはMACに対するものであり、Windowsには適用されないようです。それは私を導きました:

  17. me.m01.eu は、C:\Users\username\.gnupgを指すGNUPGHOMEという新しい環境変数を追加することを示唆しています。そのディレクトリは存在しますが、 git commit signing failedの回答で述べたように、秘密鍵が使用できません 私の新しいgpgはC:\Users\username\AppData\Roaming\gnupgを使用しているので、代わりに追加しました。 printenv GNUPGHOMEで確認して、正しく追加したことを確認しました(再起動する必要がありました)。しかし、何も変更しませんでした。

  18. 私のキーはC:\Users\username\.gnupgであると思うので、環境変数をそこに向けようとしましたが、助けにはなりませんでした。gpg --list-keysはまだ空でした。そのため、キーがどこにあるかをgpgに指摘する別の方法を見つける必要がありました。

  19. gpg --list-keys --homedir='C:/Users/s156757/.gnupg'は正しいキーを提供したので、homedir C:\Users\s156757\.gnupgを作成する必要があるC:\Users\username\AppData\Roaming\gnupg\gpg.confファイルに追加することにしました。 このバグ のため。 gpg --list-keysがキーを返したことを確認しました。 no-ttyuse-agentをこのconfファイルに追加しても同じエラーが解決しませんでした。

IntelliJ内からコミットできるようになりましたが、Git Bashを使用してコミットできなくなり、skipped "keyid": No secret keyになります。

その他の考え

  1. gpg --export [ID] | gpg2 --import && gpg --export-secret-keys [ID] | gpg2 --importを使用してキーをgpgからgpg2にエクスポートすることができませんでした
  2. Gpg4winだけで設定できると思ったので、毎回パスワードを入力する必要はありません。残念ながら、Gpg4winにパスフレーズを記憶させる方法を見つけることができませんでした。
  3. gpg --list-secret-keysがgpg 2に対して何も返さなかったことを正しく覚えていれば、後で考えました。そのコマンドはgpg --list-keysとは異なることが後でわかりました。

要するにこれが主な問題です。gpg-agentはパスフレーズのキャッシュを許可しますが、gitのgpgバージョンはgpg-agentバージョンと一致しないため、最初に適切なgpg 2をインストールする必要があります。しかし、Git BashとIntelliJの両方からコミットできるような方法で、そのインストールを実行することはできませんでした。

19
PHPirate

IDEAは端末ではないため、現時点では署名を処理できません。 https://youtrack.jetbrains.com/issue/IDEA-127802 を参照してください。

回避策はありますが、 https://youtrack.jetbrains.com/issue/IDEA-127802#comment=27-1866498 を確認してください

11
Dmitriy Smirnov