如何在像IntelliJ这样的IDE中签署git提交?

53

问题 如何在Windows上使用像IntelliJ这样的IDE签署git提交?

如果您感兴趣,请阅读我尝试过的内容:

我主要遵循了Github的指南。我确保在更改配置文件后不要忘记重新启动bash / IntelliJ。

  1. 生成一个新的GPG密钥对
  2. 将GPG密钥添加到我的GitHub账户中
  3. 将已在GitHub验证的电子邮件与我的GPG密钥关联起来,确保我的.gitconfig文件中的电子邮件与之相同。
  4. 告诉Git我的GPG密钥
  5. {{link5:用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: 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. 现在让我们实际启动这个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

  12. 但是,我在命令行上没有可用的gpg2。我安装了Gpg4win(二进制发行版,在底部),甚至单独安装了Gnupg 2,但这没有为我提供命令行中的gpg2。我注意到我的Program Files(x86)文件夹中有GNU文件夹,我认为我应该有的。我使用where gpg发现它至少没有指向我刚下载的gpg,因为那个显示在第二个位置。因此,我使用git config --global gpg.program 'C:\Program Files (x86)\GnuPG\bin\gpg.exe'将git指向正确的位置。

  13. 现在我有了错误gpg: skipped "key

    我现在可以在IntelliJ中提交,但不能再使用Git Bash提交,结果是“跳过”keyid“:没有秘密密钥”。更多想法:
    20. 我无法使用“gpg --export [ID] | gpg2 --import && gpg --export-secret-keys [ID] | gpg2 --import”将密钥从gpg导出到gpg2。 21. 我想Gpg4win可能可以单独配置,这样我就不必每次输入密码。不幸的是,我找不到任何地方让Gpg4win记住我的口令。 22. 后来我想,如果我没记错,“gpg --list-secret-keys”从未为gpg 2返回任何内容。我后来才发现该命令与“gpg --list-keys”不同。 总之,主要问题是:gpg-agent允许口令缓存,但git的gpg版本与gpg-agent版本不匹配,因此您必须首先安装正确的gpg 2。但我没能以这样的方式安装它,使得我可以从Git Bash和IntelliJ都提交。

2
git config --global commit.gpgsign true 这就是我一直在寻找的! - user4399002
3个回答

63

自 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路径但不是顶级路径,在Windows上在你的C:\Users\username\.bash_profile中添加alias gpg="'C:\path\to\Git\usr\bin\gpg.exe'",如果文件不存在则创建它,并重新启动git bash。再次尝试where gpggpg --version。从现在开始,当你在一个文件中输入gpg时,你应该用'C:\path\to\Git\usr\bin\gpg.exe'代替它。
  1. 检查gpg --version的输出是否类似于(在Linux上)/home/username/.gnupg或(在Windows上)/c/Users/username/.gnupg。该目录不一定存在。

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

  1. 接下来的几个步骤来自于Github指南,最好在那里检查命令是否仍然正确。首先生成新的GPG密钥对(但不要安装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. 将GPG密钥添加到您的GitHub帐户:转到设置| SSH和GPG密钥,并添加包括标题和页脚的公钥块。
  4. 在设置>版本控制>Git>配置GPG密钥中告诉Git您的GPG密钥,如Mahozad的答案所示,请点赞或者手动告诉gitgit 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. 使用GPG签署提交git 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上是否为“已验证”状态。

3. 将明文密码传输到gpg

这意味着您永远不必提供密码,但对我来说,这意味着GitHub会在我的提交上放置一个“未验证”的徽章。这里的问题是:签名中key-id对应的密钥没有签署此提交

如果您已经创建了它,请使用下面的代码替换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上仍然是“已验证”的。

旧版git版本没有gpg2的解决方法

供参考,以下是完整的操作步骤,或者说是我采取的步骤,使其部分工作。通过“工作”,我的意思是提交自动签名,但有两个缺点:

如果遇到问题,请检查问题中的步骤,看看是否有相同的问题。

  1. 首先按照 Github的指南 执行以下步骤:生成新的GPG密钥对

  2. 将GPG密钥添加到您的GitHub帐户中

  3. 将得到 GitHub 验证的电子邮件与您的 GPG 密钥关联起来,并确保 .gitconfig 中的名称和电子邮件地址相同。

  4. 告诉Git您的GPG密钥

  5. 使用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. 我在 C:\Users\username\.bash_profile 中放置了 alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'" 以将 gpg 命令指向我的新 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需要输入密码才能使其正常工作。对我来说,似乎应该存在比在计算机上保存明文密码更好的解决方案,所以请在找到更好的解决方案时留下评论。
11. 使用git config --global gpg.program C:\\Users\\username\\gpg-no-tty.sh命令将git指向此脚本。 12. 现在在Git Bash和IntelliJ中测试您是否可以提交,并通过执行git verify-commit HEAD进行验证。

我没有尝试过这个,但点赞数表明它运行良好。因此,请考虑更改已接受的答案@PHPirate。 - kaartic
@kaartic 是的,看起来我的后来的回答已经超过了被接受的那个,我改了它 :) - PHPirate
您还需要运行 git config --global commit.gpgsign true 命令,否则提交将不会自动签名。能否将它添加到答案中? - Slava Fomin II
@SlavaFominII,实际上在答案中已经有了,即第一部分的第12步。 - PHPirate
@PHPirate 是的,你说得对,看起来我在长文中漏掉了,谢谢 :) - Slava Fomin II
我不得不在Windows上的start-gpg.sh文件的第一行添加#!/bin/sh。否则我会得到“error: cannot spawn C:\Users\username\start-gpg.sh: Exec format error”错误提示。 - Tim S.

12

{btsdaf} - PHPirate

11
截至IntelliJ的版本2021.2,您可以配置IDE自动为您签署提交。
请参考IntelliJ 文档视频教程了解如何操作。
并参考GitHub文档了解如何向您的GitHub帐户添加GPG密钥。

Configuring the GPG key in IntelliJ settings


我确实也在发布说明中注意到了,谢谢你的回答!我相信它只是一个用于gitconfig条目的UI元素,但它确实使这一步更容易了。 - PHPirate
1
是的!但这是每个项目的配置... - garciparedes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接