全新安装Linux之后,我尝试设置我的环境,并且在本地提交更改后不断出现Git: gpg failed to sign the data
错误。我使用的是Visual Studio Code(专有而非开源版本)。
.gitconfig:
[user]
name = djweaver-dev
email = [email protected]
signingkey = 37A0xxxx...
[core]
excludesfile = /home/dweaver/.gitignore_global
[commit]
gpgSign = true
yikes。此外我找不到复制输出日志的方法,也找不到该日志在哪里,所以这是一张图片:
我到目前为止已采取的步骤:
"git.enableCommitSigning": true
通常,当我过去提交时,会出现一个对话框,要求在提交时进行GPG身份验证。我现在不知道这个,只是错误对话框。
更新:好吧,现在我真的很困惑。我重新启动了vscode(这不是我第一次在此过程中完成此操作),并且可以正常工作。我唯一能想到的就是也许以某种方式混淆了目录?无论哪种方式,它现在都可以使用。
更新:奇怪的是,在全新安装Arch之后近一个月后,我又回到了同样的问题。我已经尝试了在此站点上可以找到的所有内容,但没有任何效果。
我尝试将
export GPG_TTY=$(tty)
添加到.bash_profile和.bashrc中Git日志:
Looking for git in: git
Using git 2.26.2 from git
> git rev-parse --show-toplevel
> git rev-parse --git-dir
Open repository: /home/dw/dev/website
> git status -z -u
> git symbolic-ref --short HEAD
> git rev-parse master
> git rev-parse --symbolic-full-name master@{u}
> git rev-list --left-right master...refs/remotes/origin/master
> git for-each-ref --format %(refname) %(objectname) --sort -committerdate
> git remote --verbose
Failed to watch ref '/home/dw/dev/website/.git/refs/remotes/origin/master', is most likely packed.
Error: ENOENT: no such file or directory, watch '/home/dw/dev/website/.git/refs/remotes/origin/master'
at FSWatcher.start (internal/fs/watchers.js:165:26)
at Object.watch (fs.js:1270:11)
at Object.t.watch (/usr/lib/code/extensions/git/dist/main.js:1:604919)
at T.updateTransientWatchers (/usr/lib/code/extensions/git/dist/main.js:1:83965)
at e.fire (/usr/lib/code/out/vs/workbench/services/extensions/node/extensionHostProcess.js:46:87)
at e.updateModelState (/usr/lib/code/extensions/git/dist/main.js:1:103179)
> git config --get commit.template
> git check-ignore -v -z --stdin
> git check-ignore -v -z --stdin
> git commit --quiet --allow-empty-message --file - -S
error: gpg failed to sign the data
fatal: failed to write commit object
> git config --get-all user.name
> git config --get-all user.email
与上次相同的配置,
user.name
和user.email
都与我一直在尝试的每个键都匹配... user.signingkey
匹配。不确定该版本还有什么其他用途,因为我已经在新初始化的本地存储库中尝试了该存储库,并且在vscode终端仿真器中使用正式的MS vscode(AUR)和OSS版本从github提取了该存储库,如下所示:以及具有相同结果的gnome终端,因此它必须是git或gnugp的东西。我注意到的是,在未签名的情况下提交后,它将在以下情况下立即起作用:第一次提示输入我的 key 密码,然后在以后的提交中起作用,直到看似随机的分钟数,才失效不再,该过程必须重复。
有一些macOS用户发布了有关在后台运行停止的
gpg-agent
并为他们修复它的信息,但是,我看到了:[dw@dwLinux website]$ gpg-agent
gpg-agent[2870]: gpg-agent running and available
有趣的是,通过执行
echo "test" | gpg --clearsign
,我得到了相同的结果:它可以工作很短的时间,然后我就不能再签名了。更新
好吧,第二天尝试解决此问题。为了排除here所述的gpg-agent理论,我按照有关如何使用Arch Linux Wiki上演示的
$ gpg-connect-agent reloadagent /bye
命令重新加载gpg-agent的说明进行操作这无效
因此,我可以在vscode官方代码,oss代码和vscodium以及bash上重现此问题,因此我认为可能是与权限相关的问题,因为Linux中的许多问题通常都是。我将用户添加到各种组中,包括root和,这也对无效,因此我认为可以放心排除以下情况:
因此,我的下一个重点是配置文件本身,但是正如凭据与
.gitconfig
中的 key 匹配以及我的.bash_profile
已使用export GPG_TTY=$(tty)
正确配置之前所述。官方GnuPG docs上的一个有趣的注释显示了它们的方式之间的语法差异,以及指示您将此方式附加到GitHub docs上的.bash_profile的方式之间的语法差异。here
据我了解,bash中的
$(whatever)
是要执行命令的命令,但是为了安全起见,我同时使用.bash_profile和都没有解决问题。 最后一件事
在this post中,用户谈论到守护进程执行gpg-agent身份验证并且由另一个应用程序(例如VSCode之类的IDE)启动gpg访问时,gpg-agent身份验证不可用,这解释了我如何在提交随机文件或执行
echo "test" | gpg --clearsign
之后临时签署提交。正在通过身份验证...但是,与该主题的其他大多数“解决方案”一样,他们发现,最终他们要做的就是向自己的.bash_profile中添加export GPG_TTY=$(tty)
,我已经尝试过了。从这里去哪里?
我仍然无法解释为什么它可以在我以前的安装中使用,并且坦率地说,afaik并没有改变很多。我通常经常进行全新安装,并在每次w/base-devel和nodejs/python/git/vscode/firefox/discord几乎是我的整个工作流程时,都使用lts内核保持一个相当小的Arch Linux构建。 我全都没主意了。
最佳答案
几天前,在将WS Code与WSL一起使用时,我遇到了同样的问题。问题在于VS Code无法正确加载.profile
文件(及其中的所有环境变量)(尝试运行此命令,但未获得正确的结果:echo $GPG_TTY
)。幸运的是,在VS Code首选项中为shell args设置“-l”选项对我来说很有效。这样可以确保.profile
(或.zprofile
)文件已成功加载。
我将这些行添加到settings.json
中:
"terminal.integrated.shellArgs.linux": [
"-l"
]
确保在export GPG_TTY=$(tty)
文件中添加.profile
,然后重新启动终端和VS Code。关于linux - 'Git : gpg failed to sign the data' in visual studio code,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61067967/