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

时间:2017-10-21 13:54:16

标签: git intellij-idea gnupg

  

问题如何在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. 签名的
  8. 当我尝试在IntelliJ中提交时,我得到gpg: cannot open tty 'no tty',因此我找到IntelliJ fails to commit changes when attempting to sign commit (GPG)并将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. 第一个问题中的其他答案建议在use-agent文件中添加gpg.conf,这会导致额外的错误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,我注意到我必须在程序文件(x86)中使用GNU文件夹,我认为我应该。使用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 availablegpg: skipped "N": 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提示添加一个名为GNUPGHOME的新环境变量,该变量指向C:\Users\username\.gnupg。该目录存在,但正如git commit signing failed: secret key not available的回答中提到的,我认为我的新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文件中仍然存在相同的错误。

  22.   

    我现在可以在IntelliJ中提交但不再使用Git Bash提交,这会产生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不同。
    5. 简而言之,这是主要问题:gpg-agent允许密码短语缓存但gpg版本的git与gpg-agent版本不匹配,所以你必须先自己安装正确的gpg 2。但是我没有设法以我可以从Git Bash和IntelliJ提交的方式进行安装。

3 个答案:

答案 0 :(得分:13)

从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. 启动(在Linux上)终端或(在Windows上)git bash,使用git --version检查git是否至少为2.19.1,并使用gpg --version检查您使用的是gpg2。

    如果没有,请与where gpg(或which gpg,如果where命令不可用)一起检查最顶层的路径是git路径。

    • 如果您看不到任何路径,或者没有任何路径有gpg2,请尝试使用gpg2命令代替gpggpg2 --version。如果可行,那么从现在开始,您将不得不使用gpg2代替gpg
    • 如果您看到git路径但不是最佳路径,请在alias gpg="'C:\path\to\Git\usr\bin\gpg.exe'"中放置(在Windows上)C:\Users\username\.bash_profile,如果该文件不存在则创建该文件,并重新启动git bash。再次尝试where gpggpg --version。从现在开始,在gpg输入文件的位置,您应该将其替换为'C:\path\to\Git\usr\bin\gpg.exe'
  2. 如果主目录类似于(在Linux上)gpg --version或(在Windows上)/home/username/.gnupg,请检查/c/Users/username/.gnupg的输出。这个目录还不存在。

    如果路径不正确,请尝试更改它 - 例如在Windows上一次我看到我的主页以我运行命令的路径为前缀,因此我在.bash_profile中添加了一个别名{ {1}}并重新启动bash,然后再次检查。

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

    1。我的密钥

    上没有密码

    你已经完成了。

    2。我想尝试gpg-agent

    对我而言,这个选项并不奏效:我仍然经常提供我的密码,但并非总是如此。但理论上这是有效的:

    1. 更新缓存时间,在git verify-commit HEAD:创建文件(如果不存在),添加C:\Users\username\.gnupg\gpg-agent.confdefault-cache-ttl 34560000
    2. 使用max-cache-ttl 34560000
    3. 重新启动gpg-agent
    4. 现在你应该在提交时输入一次密码,然后再不输入密码。检查GitHub上的提交是否为gpgconf --kill gpg-agent
    5. 3。将密文以明文形式传递给gpg

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

      1. 如果您已经创建了它,请使用以下代码替换Unverified的所有内容。如果您没有,请使用以下内容创建文件,删除C:\Users\username\start-gpg.sh标记并运行--homedir。无论如何,请重启bash。
      2. 是的,您将在计算机上以明文形式放置密码!如果您有更好的方法,请发表评论......

        git config --global gpg.program C:\\Users\\username\\start-gpg.sh
        1. 提交并推送并检查您是否没有被要求输入密码,并且您的提交在GitHub上仍为# 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 "$@"
        2. 没有gpg2的旧git版本的旧答案

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

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

          1. 前几个步骤来自好Github's guideGenerate 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并确保The key whose key-id is in the signature did not sign this commit. Someone may be trying to trick you.中的姓名和电子邮件地址相同。
          4. Tell Git about your GPG key
          5. Sign a commit with GPG并确认它已在Github上验证,当您查看提交时,您应该看到一个小徽章。
          6. 将提交设置为默认情况下使用.gitconfig进行签名。进行新的提交并验证是否已使用git config --global commit.gpgsign true签名。

          7. git附带的gpg版本太旧了,所以安装Gpg4win(二进制版本,在底部)应安装gpg 2.使用git verify-commit HEAD你应该看到两条路径,其中可能第二个是你的新gpg,类似于where gpg。如果没有,请尝试从下载页面单独安装Gnupg 2。

          8. 我在C:\Program Files (x86)\GnuPG\bin\gpg.exealias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'"gpg命令指向我的新gpg,重新启动Git Bash,然后与C:\Users\username\.bash_profile核对我{&#39}。我现在正在使用gpg 2.

          9. 添加一个名为gpg --version的新环境变量,该变量指向GNUPGHOME。重新启动并检查您正确添加的C:\Users\username\.gnupg

          10. 制作一个脚本printenv GNUPGHOME并加入C:\Users\username\gpg-no-tty.sh

            你在这里以明文形式使用密码的原因是因为echo passphrase | "C:\Program Files (x86)\GnuPG\bin\gpg.exe" --passphrase-fd 0 --batch --no-tty --yes "$@"选项使得一切正常,需要使用密码短语。对我来说,似乎应该存在比在计算机上以明文保存密码短的更好的解决方案,所以如果你发现了更好的东西,请发表评论。

          11. 使用--batch将git指向此脚本。

          12. 现在在Git Bash和IntelliJ中测试你可以提交,并通过git config --global gpg.program C:\\Users\\username\\gpg-no-tty.sh验证它是否有效。

答案 1 :(得分:10)

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

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

答案 2 :(得分:3)

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

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

enter image description here