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

PHP*_*ate 19 git gnupg intellij-idea

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

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

我主要跟随Github的指南.我确保在更改配置文件后不要忘记重启bash/IntelliJ.

  1. 生成新的GPG密钥对
  2. 将GPG密钥添加到我的GitHub帐户
  3. 将经过验证的(通过GitHub)电子邮件与我的GPG密钥相关联,我确保我的电子邮件.gitconfig是相同的.
  4. 告诉Git关于我的GPG密钥
  5. 与GPG签署提交并确认它已在Github上进行了Verfied.
  6. 从同一页面,我设置默认签名的提交git config --global commit.gpgsign true(我正在使用git 2.12).我做了一个新的提交并验证它已签名git verify-commit HEAD
  7. 当我尝试在IntelliJ中提交时,我gpg: cannot open tty 'no tty'发现IntelliT在尝试签名提交(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生存时间,因此我创建该文件并添加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 --version比它更新gpg --version,所以我想有gpg2所以我可以跑git config --global gpg.program gpg2.

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

  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工作正常,但新版本可能需要更多的熵.在任何情况下,我都找不到任何在Internet上具有相同问题的Windows用户.

  15. 有用!当我在IntelliJ中提交时,它只需要一次带有pinentry的密码短语.但是现在我无法从Git Bash提交no secret key错误,因为我说的gpg --list-keys是空的:没有关键与这个gpg有关.

  16. Intellij IDEA签署GIT提交与GPG相关,但唯一的答案是MAC,似乎不适用于Windows.它确实引导我:

  17. me.m01.eu暗示添加名为新的环境变量GNUPGHOME指向C:\Users\username\.gnupg.该目录存在,但正如git提交回答中提到的那样失败:秘密密钥不可用我想我的新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必须创建的文件中.因为这个bug.我确认gpg --list-keys退回了我的钥匙.仍然相同的错误,添加no-ttyuse-agent此conf文件没有帮助.

我现在可以从IntelliJ中提交但不再使用Git Bash提交,结果是skipped "keyid": No secret key.

更多的想法

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

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

PHP*_*ate 21

从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. 启动(在Linux上)一个终端或(在Windows上)git bash,检查git --version那个git至少gpg --version是2.19.1并且你正在使用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'.
  2. 检查gpg --version主目录是否类似(在Linux上)/home/username/.gnupg或(在Windows上)的输出/c/Users/username/.gnupg.此目录不一定存在.

    如果路径不正确,请尝试更改它 - 例如在Windows上一次我看到我的主页以我运行命令的路径为前缀,因此我在.bash_profilewith中alias gpg="gpg --homedir=/c/Users/s156757/.gnupg"重新设置了别名并重新启动了bash,然后再次检查.

  3. 接下来的几个步骤来自优秀的Github指南,最好是检查命令是否仍然正确.首先,生成一个新的GPG密钥对(但不要安装gnupg工具!):运行gpg --full-generate-key,选择RSA和RSA以及4096位.
  4. 作为真实姓名使用你user.name~\.gitconfig.
  5. 作为电子邮件,使用电子邮件从user.email你的~\.gitconfig,确保这封邮件是在GitHub上经过验证的电子邮件.
  6. 如果您想尝试gpg-agent(每次重启后必须至少提供一次密码),或者如果您在GitHub上使用"未经验证"的徽章,请提供密码.否则,请将其留空.
  7. 每次你想检查你有什么键,请使用gpg --list-secret-keys --keyid-format LONG.现在就做,然后key_id从输出中复制(因为我将从现在开始命名你的密钥)sec rsa4096/key_id 2018-10-27 [SC] ....
  8. 打印公钥gpg --armor --export key_id.
  9. 将GPG密钥添加到您的GitHub帐户:转到Settings | SSH and GPG keys并添加公钥块(包括页眉和页脚).
  10. 告诉Git关于你的GPG密钥:git config --global user.signingkey key_id.
  11. 如果您之前必须使用该--homedir选项,则需要确保当git启动gpg时,主页也会正确更改.创建一个文件C:\Users\username\start-gpg.sh并放入其中gpg --homedir=/c/Users/s156757/.gnupg "$@".然后运行git config --global gpg.program C:\\Users\\username\\start-gpg.sh告诉git使用它.
  12. 重启bash.
  13. 注册一个犯了GPGgit commit -S -m "signed commit",并确认这是在Github上验证,你应该看到一个小徽章,当你查看你的提交.
  14. 设置默认情况下要签名的提交git config --global commit.gpgsign true.进行新的提交并验证是否已签名git verify-commit HEAD.

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

我的钥匙上没有密码

你完成了.

我想试试gpg-agent

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

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

3.将明文密码短语发送到gpg

这意味着您永远不必提供密码,但对我而言,这意味着GitHub会Unverified在我的提交中放置徽章.问题:key-id在签名中的密钥没有签署此提交

  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 "$@"
Run Code Online (Sandbox Code Playgroud)
  1. 提交并推送并检查您是否没有被要求输入密码,并且您的提交仍然Verified在GitHub上.

没有gpg2的旧git版本的旧答案

作为参考,这里是完整的说明,或者更确切地说是我为使其有所工作所采取的步骤."工作"是指提交是自动签名的,但有两个缺点:

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

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

  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. 我把alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'"给点gpg命令到我的新GPG在我C:\Users\username\.bash_profile,重新启动的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 git config --global gpg.program C:\\Users\\username\\gpg-no-tty.sh.

  12. 现在在Git Bash和IntelliJ中测试你可以提交,并验证它是否正常工作git verify-commit HEAD.


Mah*_*zad 12

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

请参阅 IntelliJ文档视频教程了解如何执行此操作。
请参阅GitHub 文档,了解如何将 GPG 密钥添加到您的 GitHub 帐户。

在 IntelliJ 设置中配置 GPG 密钥


Dmi*_*nov 11

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

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


归档时间:

查看次数:

6441 次

最近记录:

6 年,2 月 前