问题如何在Windows上使用像IntelliJ这样的IDE签署git提交?
如果您有兴趣,请阅读我在此尝试的内容:
我主要关注Github's guide。我确保在更改配置文件后不要忘记重启bash / IntelliJ。
.gitconfig
中的电子邮件是相同的。git config --global commit.gpgsign true
(我正在使用git 2.12)。我做了一个新的提交并验证它是用git verify-commit HEAD
当我尝试在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
文件中并重新启动。
然后我得到错误gpg: Sorry, no terminal at all requested - can't get input
这似乎是合理的,因为我刚刚添加了与没有终端有关的选项。与gpg: Sorry, no terminal at all requested - can't get input一样,解决方案是删除我希望不适用于我的案例的no-tty
。
第一个问题中的其他答案建议在use-agent
文件中添加gpg.conf
,这会导致额外的错误gpg: gpg-agent is not available in this session
。等等,也许我需要设置gpg-agent。
我能找到的最佳Windows指南是Archlinux wiki(是的,右)。它指定将生存时间添加到C:/Users/username/.gnupg/gpg-agent.conf
,因此我创建该文件并按照default-cache-ttl 34560000
和max-cache-ttl 34560000
添加
https://superuser.com/questions/624343/keep-gnupg-credentials-cached-for-entire-user-session
现在让我们真正启动这个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
。
但我没有在命令行上使用gpg2。我安装了Gpg4win(二进制版本,在底部),甚至分别是Gnupg 2但是在命令行上没有给我gpg2,我注意到我必须在程序文件(x86)中使用GNU文件夹,我认为我应该。使用where gpg
我发现它至少没有指向我刚下载的gpg,因为那个显示了第二个。所以我用git config --global gpg.program 'C:\Program Files (x86)\GnuPG\bin\gpg.exe'
现在我收到错误gpg: skipped "keyid": secret key not available
。 gpg: skipped "N": secret key not available中的解决方案就是我刚才所做的,所以这没有帮助。然后我意识到我用其他gpg设置了一切,而不是用这个。我做了alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'"
,检查了gpg --version
并重新完成了所有事情。实际上我把别名行放在我的.bash_profile
中,所以我不需要每次都运行它。
当我尝试gpg --gen-key
时,它会立即挂起。不知道为什么,我不认为问题不够熵,因为较旧的gpg工作正常,但新版本可能需要更多的熵。在任何情况下,我都无法在互联网上找到任何具有相同问题的Windows用户。
有效!当我在IntelliJ中提交时,它只需要一次带有pinentry的密码短语。但是现在我无法使用Git Bash提交no secret key
错误,因为我说gpg --list-keys
是空的:没有键与此gpg相关联。
Intellij IDEA signing GIT commits with GPG是相关的,但唯一的答案是MAC,似乎不适用于Windows。它确实引导我:
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
检查了我是否正确添加了它(我必须重新启动)。虽然没有改变任何东西。
由于我认为我的密钥在C:\Users\username\.gnupg
中我尝试将环境变量指向那里,但它没有帮助,gpg --list-keys
仍然是空的。所以我必须找到另一种方法来指出我的钥匙所在的gpg。
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-tty
和use-agent
添加到此conf文件中仍然存在相同的错误。
我现在可以在IntelliJ中提交但不再使用Git Bash提交,这会产生
skipped "keyid": No secret key
。
更多想法
gpg --export [ID] | gpg2 --import &&
gpg --export-secret-keys [ID] | gpg2 --import
gpg --list-secret-keys
从未为gpg 2返回任何内容。我后来发现该命令与gpg --list-keys
不同。简而言之,这是主要问题:gpg-agent允许密码短语缓存但gpg版本的git与gpg-agent版本不匹配,所以你必须先自己安装正确的gpg 2。但是我没有设法以我可以从Git Bash和IntelliJ提交的方式进行安装。
答案 0 :(得分:13)
这样可以更轻松地使用gpg自动签名提交。 确切地说,git版本2.19.1至少有gpg 2.2.9。 这些说明在Windows 7,Windows 8.1,Windows 10,Arch Linux和Fedora 29上进行了测试。
配置git提交签名的步骤
启动(在Linux上)终端或(在Windows上)git bash,使用git --version
检查git是否至少为2.19.1,并使用gpg --version
检查您使用的是gpg2。
如果没有,请与where gpg
(或which gpg
,如果where
命令不可用)一起检查最顶层的路径是git路径。
gpg2
命令代替gpg
,gpg2 --version
。如果可行,那么从现在开始,您将不得不使用gpg2
代替gpg
。alias gpg="'C:\path\to\Git\usr\bin\gpg.exe'"
中放置(在Windows上)C:\Users\username\.bash_profile
,如果该文件不存在则创建该文件,并重新启动git bash。再次尝试where gpg
和gpg --version
。从现在开始,在gpg
输入文件的位置,您应该将其替换为'C:\path\to\Git\usr\bin\gpg.exe'
。如果主目录类似于(在Linux上)gpg --version
或(在Windows上)/home/username/.gnupg
,请检查/c/Users/username/.gnupg
的输出。这个目录还不存在。
如果路径不正确,请尝试更改它 - 例如在Windows上一次我看到我的主页以我运行命令的路径为前缀,因此我在.bash_profile
中添加了一个别名{ {1}}并重新启动bash,然后再次检查。
alias gpg="gpg --homedir=/c/Users/s156757/.gnupg"
,选择RSA和RSA以及4096位。gpg --full-generate-key
时的user.name
作为真实姓名。~\.gitconfig
中user.email
的电子邮件,确保此电子邮件是GitHub上经过验证的电子邮件。~\.gitconfig
。立即执行此操作,然后从输出gpg --list-secret-keys --keyid-format LONG
复制key_id
(因为我将从现在开始命名您的密钥)。sec rsa4096/key_id 2018-10-27 [SC] ...
。Settings | SSH and GPG keys
并添加公钥块(包括页眉和页脚)。gpg --armor --export key_id
。git config --global user.signingkey key_id
选项,则需要确保当git启动gpg时,主页也会正确更改。创建一个文件--homedir
并将其放入C:\Users\username\start-gpg.sh
。然后运行gpg --homedir=/c/Users/s156757/.gnupg "$@"
告诉git使用它。git config --global gpg.program C:\\Users\\username\\start-gpg.sh
并确认它在Github上已经过验证,当您查看提交时,您应该看到一个小徽章。 git commit -S -m "signed commit"
。进行新的提交并验证是否已使用git config --global commit.gpgsign true
签名。你已经完成了。
对我而言,这个选项并不奏效:我仍然经常提供我的密码,但并非总是如此。但理论上这是有效的:
git verify-commit HEAD
:创建文件(如果不存在),添加C:\Users\username\.gnupg\gpg-agent.conf
和default-cache-ttl 34560000
。max-cache-ttl 34560000
gpgconf --kill gpg-agent
。这意味着您永远不必提供密码,但对我而言,这意味着GitHub会在我的提交中放置Verified
徽章。问题在这里:The key whose key-id is in the signature did not sign this commit
Unverified
的所有内容。如果您没有,请使用以下内容创建文件,删除C:\Users\username\start-gpg.sh
标记并运行--homedir
。无论如何,请重启bash。是的,您将在计算机上以明文形式放置密码!如果您有更好的方法,请发表评论......
git config --global gpg.program C:\\Users\\username\\start-gpg.sh
# 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 "$@"
。 作为参考,这里是完整的说明,或者更确切地说是我为使其有所作为所采取的步骤。随着'工作'我的意思是提交是自动签名的,但有两个缺点:
Verified
:
unverified
有关此问题的后续问题是The key whose key-id is in the signature did not sign this commit 如果您遇到问题,请检查问题中的步骤,看看是否有同样的问题。
The key whose key-id is in the signature did not sign this commit. Someone may be trying to trick you.
中的姓名和电子邮件地址相同。将提交设置为默认情况下使用.gitconfig
进行签名。进行新的提交并验证是否已使用git config --global commit.gpgsign true
签名。
git附带的gpg版本太旧了,所以安装Gpg4win(二进制版本,在底部)应安装gpg 2.使用git verify-commit HEAD
你应该看到两条路径,其中可能第二个是你的新gpg,类似于where gpg
。如果没有,请尝试从下载页面单独安装Gnupg 2。
我在C:\Program Files (x86)\GnuPG\bin\gpg.exe
中alias gpg="'C:\Program Files (x86)\GnuPG\bin\gpg.exe'"
将gpg
命令指向我的新gpg,重新启动Git Bash,然后与C:\Users\username\.bash_profile
核对我{&#39}。我现在正在使用gpg 2.
添加一个名为gpg --version
的新环境变量,该变量指向GNUPGHOME
。重新启动并检查您正确添加的C:\Users\username\.gnupg
。
制作一个脚本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 "$@"
选项使得一切正常,需要使用密码短语。对我来说,似乎应该存在比在计算机上以明文保存密码短的更好的解决方案,所以如果你发现了更好的东西,请发表评论。
使用--batch
将git指向此脚本。
现在在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 配置为自动为您签署提交。
有关如何执行此操作,请参阅 documentations 或 video tutorial。
并参考 here 了解如何将 GPG 密钥添加到您的 GitHub 帐户。