繁体   English   中英

Visual Studio 代码中的“Git:gpg 未能签署数据”

[英]'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 日志的方法,也找不到该日志的位置,所以这是一张图片:

输出日志

到目前为止我已采取的步骤:

  • 在 gnugp 中生成新密钥 (RSA 4096)
  • 向 global.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.nameuser.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,这也没有任何效果,所以我认为我可以安全地排除以下情况:

  • VS 代码
  • GnuGP
  • gpg-代理
  • Linux 权限

因此,我的下一个重点是配置文件本身,但正如之前所述,凭据与.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 中,用于您的开发容器。

我有同样的问题,我已经解决了。

背景

  • 苹果系统
  • GPG Suite 生成 GPG 密钥
  • pinentry-mac

我如何解决这个问题

我看到了这个答案,并遵循了它。

  1. 获取密钥
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]
  1. 由于x@xxgolo.com是我为其创建秘密的 email, 926E268C01892E8A2FCCD2A101CEB6267272A9A5是我需要的密钥代码。
  2. 让 git 使用这个密钥。
git config --global user.signingkey 926E268C01892E8A2FCCD2A101CEB6267272A9A5
  1. 现在它应该可以工作了。
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM