【问题标题】:How to sign git commits from within an IDE like IntelliJ?如何从 IntelliJ 等 IDE 中签署 git 提交?
【发布时间】:2017-10-21 13:54:15
【问题描述】:

问题如何在 Windows 上使用 IntelliJ 等 IDE 签署 git 提交?

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

我主要关注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. 1234563
  8. 然后我收到错误gpg: Sorry, no terminal at all requested - can't get input,这似乎是合理的,因为我刚刚添加了与无终端有关的选项。就像gpg: Sorry, no terminal at all requested - can't get input 说的解决方案是删除我希望不适用于我的情况的no-tty

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

  10. 我能找到的最好的 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

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

  13. 将git指向了右边
  14. 现在我有错误gpg: skipped "keyid": secret key not availablegpg: skipped "N": secret key not available 中的解决方案是我刚刚所做的,所以没有帮助。然后我意识到我用另一个 gpg 设置了所有东西,而不是这个。我做了alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'",检查了gpg --version,然后又做了整件事。实际上我把别名行放在我的.bash_profile 中,所以我不需要每次都运行它。

  15. 当我尝试gpg --gen-key 时,它会立即挂起。不知道为什么,我认为问题不是熵不够,因为旧的 gpg 运行良好,但新版本可能需要更多的熵。无论如何,我在 Internet 上找不到任何有相同问题的 Windows 用户。

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

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

  18. me.m01.eu 提示添加一个名为GNUPGHOME 的新环境变量,它指向C:\Users\username\.gnupg。该目录存在,但正如git commit signing failed: secret key not available 的回答中所述,我认为我的新gpg 使用C:\Users\username\AppData\Roaming\gnupg,所以我添加了它。我检查了printenv GNUPGHOME 是否正确添加了它(我必须重新启动)。不过没有改变任何东西。

  19. 由于我的密钥在C:\Users\username\.gnupg 中,我尝试将环境变量指向那里,但没有帮助,gpg --list-keys 仍然是空的。所以我必须找到另一种方法来向 gpg 指出我的密钥在哪里。

  20. 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文件没有帮助。

我现在可以在 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 提交的方式进行安装。

【问题讨论】:

  • git config --global commit.gpgsign true 这就是我要找的全部内容!

标签: git intellij-idea gnupg


【解决方案1】:

从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 commit 签名的步骤

  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(或which gpg,如果where 命令不可用)最顶层的路径是 git 路径。

  • 如果您没有看到任何路径或没有任何具有 gpg2 的路径,请尝试使用 gpg2 命令而不是 gpg,所以 gpg2 --version。如果可行,从现在开始,您将不得不使用 gpg2 而不是 gpg
  • 如果您看到 git 路径但它不是最上面的路径,请将(在 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_profilealias gpg="gpg --homedir=/c/Users/s156757/.gnupg" 中添加了一个别名并重新启动 bash,然后再次检查。

  1. 接下来的几个步骤来自良好的Github's guide,最好检查那里的命令是否仍然正确。首先,generate a new GPG key pair(但不要安装 gnupg 工具!):运行gpg --full-generate-key
  • 选择 RSA 和 RSA 以及 4096 位。
  • 使用您的user.name~\.gitconfig 作为真实姓名。
  • 作为电子邮件,在您的~\.gitconfig 中使用来自user.email 的电子邮件,确保此电子邮件是 GitHub 上经过验证的电子邮件。
  • 如果您想尝试 gpg-agent(每次重新启动后必须至少提供一次密码)或者如果您对 GitHub 上的“未验证”徽章感到满意,请提供密码。否则,请将其留空。
  1. 每次您想检查您拥有的密钥时,请使用gpg --list-secret-keys --keyid-format LONG。立即执行,然后从输出 sec rsa4096/key_id 2018-10-27 [SC] ... 中复制 key_id(我将从现在开始为您的密钥命名)。
  2. gpg --armor --export key_id打印公钥。
  3. Add the GPG key to your GitHub account:转到Settings | SSH and GPG keys 并添加公钥块(包括页眉和页脚)。
  4. Tell Git about your GPG key in Settings > Version Control > Git > Configure GPG Key 如图所示in Mahozad's answer, please give it an upvote tell git manually: git config --global user.signingkey key_id
  5. 如果你之前必须使用--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 使用它。
  6. 重启 bash。
  7. Sign a commit with GPGgit commit -S -m "signed commit" 并确认它已在 Github 上验证,当您查看提交时应该会看到一个小徽章。
  8. 将提交设置为默认使用git config --global commit.gpgsign true 签名。在 IntelliJ 中进行新的提交并验证它是否使用 git verify-commit HEAD 签名。

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

1.我的密钥上没有密码

你已经完成了。

2.我想试试 gpg-agent

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

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

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

这意味着您永远不必提供密码,但对我而言,这意味着 GitHub 在我的提交上放置了一个 Unverified 徽章。问题在这里:The key whose key-id is in the signature did not sign this commit

  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 版本的旧答案

作为参考,这里是完整的说明,或者更确切地说是我为使它有点工作所做的步骤。对于“工作”,我的意思是提交是自动签名的,但有两个缺点:

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

  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 验证它是否有效。

【讨论】:

  • 我还没有尝试过,但赞成票表明这很好用。因此,请考虑更改接受的答案@PHPirate。
  • @kaartic 是的,看来我后来的答案已经超过了接受的答案,改变了它:)
  • 你还需要运行git config --global commit.gpgsign true,否则提交将不会自动签名。您能否将其添加到答案中?
  • @SlavaFominII 它已经在答案中,实际上是第 12 步(第一部分)。
  • @PHPirate 是的,你是对的,看起来我在长文本中错过了它,谢谢 :)
【解决方案2】:

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

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

【讨论】:

  • 啊,我不知道--batch 选项,非常感谢!正如unix.stackexchange.com/questions/60213/… 中提到的那样,我必须将我的密码输入其中以使其正常工作。所以我的 shell 脚本变成了echo passphrase | gpg --passphrase-fd 0 --batch --no-tty --yes "$@",在我的 gitconfig 中变成了C:\\Users\\s156757\\gpg-no-tty.sh。稍后我会将其写成完整的答案,以供将来的用户使用。
【解决方案3】:

从 IntelliJ 的 2021.2 版本开始,您可以将 IDE 配置为自动为您签署提交。

请参阅 IntelliJ documentationsvideo tutorial 了解如何执行此操作。
有关如何将 GPG 密钥添加到您的 GitHub 帐户,请参阅 GitHub docs

【讨论】:

  • 我确实在发行说明中也注意到了这一点,感谢您的回答!我相信它只是 gitconfig 条目的 UI 元素,但它确实使这一步更容易。
  • 是的!但这是每个项目的配置...
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多