[英]'Git: gpg failed to sign the data' in visual studio code
在新的 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
哎呀。 此外,我找不到复制 output 日志的方法,也找不到该日志的位置,所以这是一张图片:
到目前为止我已采取的步骤:
"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
匹配。 不知道 go 的其他地方还有这个,因为我已经在新初始化的本地存储库以及我从 github 提取的存储库中进行了尝试,在 vscode 终端仿真器中使用官方 MS vscode(AUR)和 OSS 版本作为以及具有相同结果的 gnome 终端,因此它必须是 git 事物或 gnugp 事物。
我注意到的是,在没有签名的情况下提交后,它将立即工作:我第一次被提示输入我的密钥密码,然后它在后续提交上工作,直到看似随机的几分钟后,它就不再工作了并且必须重复该过程。
有一些 macos 用户发布了关于在后台运行停滞的gpg-agent
并为他们修复了它,但是,我看到:
[dw@dwLinux website]$ gpg-agent
gpg-agent[2870]: gpg-agent running and available
有趣的是,通过echo "test" | gpg --clearsign
echo "test" | gpg --clearsign
我得到了相同的结果:它工作了很短的时间,然后我就不能再签名了。
更新
好的,所以尝试解决此问题的第 2 天。 为了排除这里描述的 gpg-agent 理论,我按照Arch Linux Wiki上演示的$ gpg-connect-agent reloadagent /bye
命令重新加载 gpg-agent 的说明进行操作
这没有效果
因此,由于我可以在 vscode 官方、oss 代码和 vscodium 以及 bash 中重现此问题,我认为这可能是与权限相关的问题,因为 linux 的许多问题通常是. 我将我的用户添加到各种组,包括 root,这也没有任何效果,所以我认为我可以安全地排除以下情况:
因此,我的下一个重点是配置文件本身,但正如之前所述,凭据与.gitconfig
中的密钥匹配,并且我的.bash_profile
已正确配置为export GPG_TTY=$(tty)
。
来自官方GnuPG 文档的一个有趣的注释显示了他们的方式之间的语法差异,和你被指示到 append 这个 to.bash_profile 在 GitHub 文档的方式之间
来自 GnuPG: “最常见的原因是环境变量 GPG_TTY 未正确设置。确保已将其设置为真正的 tty 设备,而不仅仅是 '/dev/tty';即 'GPG_TTY= "
据我了解,bash 中的$(whatever)
是执行命令,但为了安全起见,我使用两种方式都附加了.bash_profile,但都没有解决问题。
最后一件事
在这篇文章中,用户谈到 gpg-agent 身份验证在守护进程和 gpg 访问由另一个应用程序(例如 VSCode 之类的 IDE)启动时不可用,这解释了我如何在提交随机文件或执行echo "test" | gpg --clearsign
显后临时签署提交echo "test" | gpg --clearsign
echo "test" | gpg --clearsign
并通过身份验证......但是就像这个主题的大多数其他“解决方案”一样,他们透露他们最终要做的就是将export GPG_TTY=$(tty)
添加到他们的.bash_profile 中,我有已经试过了。
go 从这里到哪里?
我仍然无法解释为什么它在我之前的安装中起作用,坦率地说,afaik 并没有改变很多。 我通常会经常进行全新安装,并且每次使用 lts kernel 和 nodejs/python/git/vscode/firefox/discord 时都会使用 lts kernel 来保持非常小的 Arch linux 构建,这几乎是我的整个工作流程。 我完全没主意了。
几天前我在使用 VS Code 和 WSL 时遇到了同样的问题。 问题是 VS Code 没有正确加载.profile
文件(以及其中的所有环境变量)(尝试运行此命令但它没有得到正确的结果: echo $GPG_TTY
)。 幸运的是,在 VS Code 首选项中为 shell 参数设置“-l”选项对我有用。 这可确保成功加载.profile
(或.zprofile
)文件。 我将这些行添加到settings.json
:
"terminal.integrated.shellArgs.linux": [
"-l"
]
确保在.profile
文件中添加export GPG_TTY=$(tty)
并重新启动终端和 VS Code。
也许 git 找不到 gpg? 那是我使用 VSCode 和使用 Remote-Containers 创建开发容器时遇到的问题。 尝试在 VSCode 的终端中运行它(在容器中)
git config --global --unset gpg.program
git config --global --add gpg.program /usr/bin/gpg
或您的 gpg 所在的任何位置。 您可以通过键入找到
which gpg
如果可行,那么您可以将其放入您的 Dockerfile 中,用于您的开发容器。
我有同样的问题,我已经解决了。
背景
我如何解决这个问题
我看到了这个答案,并遵循了它。
gpg2 --list-keys
结果
/Users/xxuser/.gnupg/pubring.kbx
---------------------------------
pub dsa2048 2010-08-19 [SC] [expires: 2024-05-11]
85E38F69046BSDFB07B76D78F0500D026C4
uid [ unknown] GPGTools Team <team@gpgtools.org>
uid [ unknown] [jpeg image of size 6329]
sub rsa4096 2014-04-08 [S] [expires: 2024-05-11]
sub rsa4096 2020-05-11 [E] [expires: 2024-05-11]
pub rsa4096 2020-05-04 [SC] [expires: 2024-05-03]
B97E9964ACAD1928300D37CC8A9E3745558E41AF
uid [ unknown] GPGTools Support <support@gpgtools.org>
sub rsa4096 2020-05-04 [E] [expires: 2024-05-03]
pub rsa4096 2021-07-29 [SC] [expires: 2025-07-29]
926E268C01892E8A2FCCD2A101CEB6267272A9A5
uid [ultimate] xxuser <x@xxgolo.com>
sub rsa4096 2021-07-29 [E] [expires: 2025-07-29]
x@xxgolo.com
是我为其创建秘密的 email, 926E268C01892E8A2FCCD2A101CEB6267272A9A5
是我需要的密钥代码。git config --global user.signingkey 926E268C01892E8A2FCCD2A101CEB6267272A9A5
git commit -S -m "This is a signed commit"
注意如果您需要它与 Github 一起使用,您需要按照本指南将您的公共 GPG 密钥添加到 Github。
首先确保在 your.bashrc 添加 export GPG_TTY=$(tty)
显然 VSCode 不要求输入密码,这就是它给出错误的原因。 我不知道原因。 我的个人解决方案首先进行控制台提交或运行以下行
echo "test" | gpg --clearsign
确保echo "test" | gpg --clearsign
echo "test" | gpg --clearsign
在尝试以下操作之前先成功运行。
检查git commit
在后台做什么非常有帮助。 使用GIT_TRACE=1
运行以下提交,如下所示
GIT_TRACE=1 git commit -S -m "MESSAGE"
这将显示提交时使用的用户名 email 和密钥 git 使用。
就我而言,我发现 git 选择了错误的用户和关键细节来签署提交。 我主要打算使用 repo 的本地配置而不是全局配置,并将以下内容添加到本地 git 配置(位于“REPO_PATH/.git/config”)得到签署提交以在终端和 VSCode 中工作
[user]
name = USER NAME
email = USER EMAIL
signingKey = SIGNING KEY
也可以通过以下方式设置:
git config --local user.name "USER NAME"
git config --local user.email "USER EMAIL"
git config --local user.signingkey "USIGNING KEY"
我不确定这是否为时已晚,但是......我确实找到了一个直接的解决方案。
要查看您拥有的 user.name 和 user.email,请运行:
git config -l
您可能会注意到 user.name 的两个条目。 你可能和我犯了同样的错误,我把我的真实姓名放在那里,而不是 GitHub 用户名。 最后有两个 user.name 条目,我只是将全局 user.name 改回了我的 github 用户名。 像这样...
git config --global user.name "ghusername"
接下来,git 提交,它应该可以工作:
git commit -m "<YOUR MESSAGE>"
让我知道这是否适合你,我想知道它是否是同样的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.