如何从 IDE 之类的 IntelliJ 中签署 git 提交?

How to sign git commits from within an IDE like IntelliJ?

Question How do I sign git commits using an IDE like IntelliJ on Windows?

如果您有兴趣,请阅读我在这里尝试的内容:

我主要关注Github's guide。我确保在更改配置文件后不要忘记重新启动 bash/IntelliJ。

  1. Generate a new GPG key pair
  2. Add the GPG key to my GitHub account
  3. Associate a verified (by GitHub) email with my GPG key 我确保 .gitconfig 中的电子邮件是相同的。
  4. Tell Git about my GPG key
  5. Sign a commit with GPG 并确认已在 Github 上验证。
  6. 在同一页面上,我将提交设置为默认使用 git config --global commit.gpgsign true 签名(我使用的是 git 2.12)。我做了一个新的提交并验证它是用 git verify-commit HEAD
  7. 签名的
  8. 当我尝试在 IntelliJ 中提交时,我得到 gpg: cannot open tty 'no tty' 所以我找到 并将 no-tty 添加到我的 C:\Users\username\.gnupg\gpg.conf 文件并重新启动.

  9. 然后我得到错误 gpg: Sorry, no terminal at all requested - can't get input 这似乎是合理的,因为我只是添加了与没有终端有关的选项。就像 gpg: Sorry, no terminal at all requested - can't get input 说的解决方案是删除 no-tty 我希望它不适用于我的情况。

  10. 第一个问题中的其他答案建议在 gpg.conf 文件中也添加 use-agent,这会导致额外的错误 gpg: gpg-agent is not available in this session。等等,也许我需要设置 gpg-agent。

  11. 我能找到的 Windows 的最佳指南是 Archlinux wiki(是的,对)。它指定将生存时间添加到 C:/Users/username/.gnupg/gpg-agent.conf,因此我创建了该文件并添加了 default-cache-ttl 34560000max-cache-ttl 34560000 https://superuser.com/questions/624343/keep-gnupg-credentials-cached-for-entire-user-session

  12. 现在让我们真正启动这个 gpg-agent,https://superuser.com/questions/1153101/why-does-git-complain-that-no-gpg-agent-is-running 让我检查确实 gpg-agent --versiongpg --version 更新得多,所以我想要gpg2 所以我可以 运行 git config --global gpg.program gpg2.

  13. 但是我在命令行上没有可用的 gpg2。我安装了 Gpg4win(二进制版本,在底部),甚至分别安装了 Gnupg 2,但在命令行上没有给我 gpg2,我注意到我必须将 GNU 文件夹放在我的程序文件 (x86) 中,我认为我应该。使用 where gpg 我发现它至少没有指向我刚刚下载的 gpg,因为那个显示第二个。所以我用 git config --global gpg.program 'C:\Program Files (x86)\GnuPG\bin\gpg.exe'

  14. 将 git 指向了正确的那个
  15. 现在出现错误 gpg: skipped "keyid": secret key not available 中的解决方案是我刚刚所做的,所以这无济于事。然后我意识到我用另一个 gpg 设置了一切,而不是这个。我做了 alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'",检查了 gpg --version,然后又做了一遍。实际上我把别名行放在我的 .bash_profile 中所以我不需要每次都 运行 它。

  16. 当我尝试 gpg --gen-key 它立即挂起。不知道为什么,我不认为问题是熵不够,因为旧的 gpg 工作正常但新版本可能需要更多的熵。无论如何,我在互联网上找不到任何遇到同样问题的 windows 用户。

  17. 有效!当我在 IntelliJ 中提交时,它只要求我输入一次带有 pinentry 的密码。但是现在我不能从 Git Bash 提交,no secret key 错误是有道理的,因为正如我所说 gpg --list-keys 是空的:没有密钥与这个 gpg 相关联。

  18. Intellij IDEA signing GIT commits with GPG 是相关的,但唯一的答案是 MAC,似乎不适用于 Windows。它确实引导我:

  19. me.m01.eu hints at adding a new environment variable called GNUPGHOME which points to C:\Users\username\.gnupg. That directory exists, but as mentioned in an answer from 我认为我的新 gpg 使用 C:\Users\username\AppData\Roaming\gnupg 所以我添加了它。我检查了 printenv GNUPGHOME 是否正确添加了它(我不得不重新启动)。虽然没有改变任何东西。

  20. 因为我认为我的密钥在 C:\Users\username\.gnupg 中,我尝试将环境变量指向那里,但它没有帮助,gpg --list-keys 仍然是空的。所以我不得不找到另一种方法来指出我的密钥所在的 gpg。

  21. gpg --list-keys --homedir='C:/Users/s156757/.gnupg' 确实给出了正确的密钥,所以我决定将 homedir C:\Users\s156757\.gnupg 添加到我必须创建的 C:\Users\username\AppData\Roaming\gnupg\gpg.conf 文件中。因为 this bug。我确认 gpg --list-keys 归还了我的钥匙。仍然是同样的错误,将 no-ttyuse-agent 添加到此 conf 文件没有帮助。

I can now commit from within IntelliJ but not anymore with Git Bash, which results in skipped "keyid": No secret key.

更多想法

  1. 我无法使用 gpg --export [ID] | gpg2 --import && gpg --export-secret-keys [ID] | gpg2 --import
  2. 将密钥从 gpg 导出到 gpg2
  3. 我认为可以单独配置 Gpg4win,这样我就不需要每次都输入密码了。不幸的是,我找不到任何方法让 Gpg4win 记住我的密码。
  4. 我后来想,如果我没记错的话 gpg --list-secret-keys 从来没有为 gpg 2 返回任何东西。我后来才发现那个命令与 gpg --list-keys 不同。

简而言之,这是主要问题:gpg-agent 允许密码缓存,但 git 的 gpg 版本与 gpg-agent 版本不匹配,因此您必须先自己安装正确的 gpg 2。但是我没有设法以可以从 Git Bash 和 IntelliJ 提交的方式进行安装。

IDEA 不是终端,目前无法处理签名。参见 https://youtrack.jetbrains.com/issue/IDEA-127802

虽然有一个解决方法,请检查 https://youtrack.jetbrains.com/issue/IDEA-127802#comment=27-1866498

从git 2.19.1开始支持gpg2!

gpg-agent 现在可以处理自动签名,记住您的密码

这将使使用 gpg 自动签署提交变得更容易。 确切地说,git 版本 2.19.1 至少有 gpg 2.2.9。 这些说明在 Windows 7、Windows 8.1、Windows 10、Arch Linux 和 Fedora 29 上进行了测试。

配置步骤git提交签名

  1. 建议您已经设置了ssh,参见例如help.github.com/en/articles/connecting-to-github-with-ssh(不使用 GitHub 时也是如此)
  2. 启动(在 Linux 上)一个终端或(在 Windows 上)git bash,用 git --version 检查 git 是至少 2.19.1 并且 gpg --version 您正在使用 gpg2.

如果不是,请检查 where gpg(如果 where 命令不可用,则检查 which gpg)最上面的路径是 git。

  • 如果您看不到任何路径或没有任何具有 gpg2 的路径,请尝试使用 gpg2 命令而不是 gpg,因此 gpg2 --version。如果可行,从现在开始您将不得不使用 gpg2 而不是 gpg
  • 如果您看到 git 路径但它不是最上面的路径,请将 (on Windows) alias gpg="'C:\path\to\Git\usr\bin\gpg.exe'" 放入您的 C:\Users\username\.bash_profile,如果没有则创建文件'不存在,然后重新启动 git bash。再次尝试 where gpggpg --version。从现在开始,在文件中输入 gpg 的地方,您应该将其替换为 'C:\path\to\Git\usr\bin\gpg.exe'
  1. 如果主目录类似于(Linux)/home/username/.gnupg 或(windows)/c/Users/username/.gnupg,请检查 gpg --version 的输出。该目录还不一定存在。

如果路径不正确,请尝试更改它 - 例如有一次在 Windows 我看到我的家的前缀是我 运行 命令所在的路径,所以我放了一个在 .bash_profile 中使用 alias gpg="gpg --homedir=/c/Users/s156757/.gnupg" 别名并重新启动 bash,然后再次检查。

  1. 接下来的几个步骤来自Github's guide, preferably you check there if commands are still correct. First, generate a new GPG key pair(但不要安装gnupg工具!):运行 gpg --full-generate-key
  • Select RSA 和 RSA 以及 4096 位。
  • 作为真实姓名使用您的 user.name 作为您的 ~\.gitconfig
  • 作为电子邮件,在您的 ~\.gitconfig 中使用来自 user.email 的电子邮件,确保该电子邮件是 GitHub 上经过验证的电子邮件。
  • 如果您想尝试 gpg-agent(每次重新启动后您必须至少提供一次密码)或者如果您对 GitHub 上的 'unverified' 徽章没问题,请提供一个密码。否则,将其留空。
  1. 每次你想检查你有哪些键时,使用gpg --list-secret-keys --keyid-format LONG。现在就做,然后从输出 sec rsa4096/key_id 2018-10-27 [SC] ....
  2. 复制 key_id(我将从现在开始命名你的密钥)
  3. gpg --armor --export key_id 打印 public 键。
  4. Add the GPG key to your GitHub account: go to Settings | SSH and GPG keys 并添加 public 关键块(包括页眉和页脚)。
  5. Tell Git about your GPG key in Settings > Version Control > Git > Configure GPG Key as shown or tell git manually: git config --global user.signingkey key_id.
  6. 如果您之前必须使用--homedir 选项,您需要确保当git 启动gpg 时,home 也被正确更改。创建一个文件 C:\Users\username\start-gpg.sh 并放入其中 gpg --homedir=/c/Users/s156757/.gnupg "$@"。然后运行git config --global gpg.program C:\Users\username\start-gpg.sh告诉git使用它。
  7. 重新启动bash。
  8. Sign a commit with GPGgit commit -S -m "signed commit" 并确认它已在 Github 上验证,当您查看您的提交时,您应该会看到一个小徽章。
  9. 将提交设置为默认使用 git config --global commit.gpgsign true 签名。在 IntelliJ 中进行新提交并验证它是否使用 git verify-commit HEAD.
  10. 签名

使提交签名自动发生的步骤:三个选项

1。我的密钥上没有密码

大功告成。

2。我想试试 gpg-agent

对我来说,这个选项不起作用:我仍然不得不经常提供我的密码,尽管并非总是如此。但理论上这是可行的:

  1. 更新缓存时间,在C:\Users\username\.gnupg\gpg-agent.conf中:如果不存在则创建文件,添加default-cache-ttl 34560000max-cache-ttl 34560000
  2. 使用 gpgconf --kill gpg-agent
  3. 重新启动 gpg-agent
  4. 现在您必须在提交时输入一次密码,之后就不必再输入了。检查您的提交是否在 GitHub.
  5. Verified

3。将明文密码短语通过管道传输到 gpg

这意味着您永远不必提供密码,但对我而言,这意味着 GitHub 在我的提交上放置了一个 Unverified 徽章。问题在这里:

  1. 如果您已经创建了它,请将 C:\Users\username\start-gpg.sh 的所有内容替换为以下代码。如果没有,请创建包含以下内容的文件,删除 --homedir 标志和 运行 git config --global gpg.program C:\Users\username\start-gpg.sh。无论如何,重启bash.

是的,您要将密码以明文形式保存在您的计算机上!如果您知道更好的方法,请发表评论...

# Passphrase-file-descriptor is set to 0 (STDIN), to use it --batch must be used
# The --pinentry-mode loopback is required since gpg 2.1.0 for --passphrase-fd
# The "$@" makes sure that whatever git wanted gpg to do, is still done
echo mypassphrase | gpg --homedir=/c/Users/username/.gnupg --passphrase-fd 0 --batch --yes --pinentry-mode loopback "$@"
  1. 提交并推送并检查您是否没有被要求输入密码,并且您的提交仍在 GitHub 上 Verified

没有 gpg2

的旧 git 版本的旧答案

作为参考,这里是完整的说明,或者更确切地说,是我为使其在一定程度上起作用而执行的步骤。使用 'work' 我的意思是提交是自动签名的,但有两个缺点:

  • GitHub 将它们识别为 unverifiedThe key whose key-id is in the signature did not sign this commit. Someone may be trying to trick you. 关于此的后续问题是
  • 创建提交需要更长的时间,比如五秒而不是不到一秒。

如果卡住了,请检查问题中的步骤,看看我是否遇到了同样的问题。

  1. 前几步来自好Github's guide: Generate a new GPG key pair

  2. Add the GPG key to your GitHub account

  3. Associate a verified (by GitHub) email with your GPG key 并确保 .gitconfig 中的姓名和电子邮件相同。

  4. Tell Git about your GPG key

  5. Sign a commit with GPG 并确认它已在 Github 上验证,当您查看您的提交时,您应该会看到一个小徽章。

  6. 将提交设置为默认使用 git config --global commit.gpgsign true 签名。进行新的提交并验证它是否使用 git verify-commit HEAD.

    签名
  7. git附带的gpg版本太旧,所以安装Gpg4win(二进制版本,在底部)应该安装gpg 2。用where gpg 你应该看到两条路径,其中第二条可能是你的新 gpg,类似于 C:\Program Files (x86)\GnuPG\bin\gpg.exe。如果没有,请尝试从下载页面单独安装 Gnupg 2。

  8. 我把 alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'" 指向 gpg 命令到我 C:\Users\username\.bash_profile 中的新 gpg,重新启动 Git Bash 和检查 gpg --version 我现在使用的是 gpg 2.

  9. 添加一个名为 GNUPGHOME 的新环境变量,它指向 C:\Users\username\.gnupg。重新启动并检查 printenv GNUPGHOME 您是否正确添加了它。

  10. 制作脚本C:\Users\username\gpg-no-tty.sh并放入其中echo passphrase | "C:\Program Files (x86)\GnuPG\bin\gpg.exe" --passphrase-fd 0 --batch --no-tty --yes "$@"

您将密码短语以明文形式放在这里的原因是 --batch 选项需要输入密码短语才能正常工作。在我看来,似乎应该有比在计算机上以明文形式保存密码短语更好的解决方案,所以如果您发现更好的方法,请发表评论。

  1. 使用 git config --global gpg.program C:\Users\username\gpg-no-tty.sh.

    将 git 指向此脚本
  2. 现在在 Git Bash 和 IntelliJ 中测试您可以提交,并通过 git verify-commit HEAD.

    验证它是否有效

自 IntelliJ 版本 2021.2 起,您可以配置 IDE 自动为您签署提交。

请参阅 IntelliJ documentations or the video tutorial 了解如何执行此操作。
并参阅 GitHub docs 了解如何将 GPG 密钥添加到您的 GitHub 帐户。