在进行了新的Linux安装后,我正在尝试设置我的环境,但在本地提交更改时不断收到Git: gpg failed to sign the data
错误。我使用的是专有的Visual Studio Code版本,而不是开源版本。
.gitconfig:
[user]
name = djweaver-dev
email = djweaver@djweaver.dev
signingkey = 37A0xxxx...
[core]
excludesfile = /home/dweaver/.gitignore_global
[commit]
gpgSign = true
糟糕,此外我找不到一种方法来复制输出日志,也不知道该日志存放在哪里,所以这里有一张图片:
我已经采取的步骤:
- 在gnugp中生成了新的密钥(RSA 4096)
- 将签名密钥添加到全局.gitconfig中
- 在Visual Studio Code设置中设置
"git.enableCommitSigning": true
- 克隆了我的github仓库
通常情况下,在过去提交时,我会得到一个对话框,要求进行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
也匹配。不确定还能做什么,因为我已经在新初始化的本地仓库和从 GitHub 拉取的仓库上尝试过,无论是在官方的 MS VSCode (AUR) 还是 OSS 版本中,在 vscode 终端模拟器和 gnome 终端中都获得了相同的结果,所以这一定是一个 git 问题或 gnugp 问题。
我注意到的是,在未签名提交后,它会立即工作:第一次会提示我输入密钥密码,然后在后续提交中就可以工作,直到几分钟后它突然停止工作,进程必须重复进行。有几个 macOS 用户报告说在后台运行了一个停滞的 gpg-agent
并解决了问题,但是,我看到的是:
[dw@dwLinux website]$ gpg-agent
gpg-agent[2870]: gpg-agent running and available
有趣的是,通过执行 echo "test" | gpg --clearsign
我得到了相同的结果:它可以在短时间内工作,然后我就不能再签名了。
更新
好吧,尝试修复这个问题第二天。为了排除如此处所述的gpg-agent理论,我按照Arch Linux Wiki上演示的使用$ gpg-connect-agent reloadagent /bye
命令重新加载gpg-agent的说明进行操作。
但是没有效果
既然我可以在vscode官方、oss code和vscodium以及bash中重现这个问题,我想也许这是一个权限相关的问题,因为很多Linux问题通常都是如此。我已经将我的用户添加到各种组中,包括root,但是这也没有效果,所以我认为我可以安全地排除以下内容:
- VS Code
- GnuGP
- gpg-agent
- Linux 权限
因此,我的下一个焦点是配置文件本身,但是如先前所述,凭据与.gitconfig
中的密钥匹配,并且我的.bash_profile
已正确配置为使用export GPG_TTY=$(tty)
。
关于官方GnuPG文档中提到的一个有趣的注意事项,显示了他们的方式和GitHub文档这里上的方式之间的语法不一致。
来自GnuPG:"造成这种情况的最常见原因是没有正确设置环境变量GPG_TTY。确保它已设置为真正的tty设备,而不仅仅是'/dev/tty';即'tty'是明显错误的;您想要的是'tty'——请注意反引号。还要确保导出此环境变量,也就是说,您应该在设置后跟随'export GPG_TTY'"
我理解bash中的$(whatever)
是执行命令,但是为了安全起见,我已经使用两种方式都附加了.bash_profile,但是都没有解决问题。
最后一件事
在这篇文章中,用户谈到守护进程化时gpg-agent身份验证不可用,当其他应用程序(如IDE,如VSCode)发起gpg访问时,这解释了我为什么可以在提交随机文件或执行echo "test" | gpg --clearsign
并进行身份验证后 暂时签署提交,但是像这个主题的大多数其他“解决方案”一样,他们揭示了最终只需将export GPG_TTY=$(tty)
添加到他们的.bash_profile中即可,但我已经尝试过了。
从这里开始?
我仍然无