linux Visual Studio程式码中的'Git:gpg无法签署数据'

k4ymrczo  于 2022-12-11  发布在  Linux
关注(0)|答案(6)|浏览(166)

在一个全新的Linux安装后,我试图设置我的环境,我在本地提交更改时一直得到Git: gpg failed to sign the data错误。我使用的是Visual Studio代码,专有版本,而不是开源版本。
.gitconfig文件:

[user]
    name = djweaver-dev
    email = djweaver@djweaver.dev
    signingkey = 37A0xxxx...
[core]
    excludesfile = /home/dweaver/.gitignore_global
[commit]
    gpgSign = true

Yikes.此外我找不到一种方法来复制输出日志,也找不到日志的位置所以这里有一张图片:

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

  • 在gnugp中生成了新密钥(RSA 4096)
  • 添加签名密钥到global .gitconfig
  • 在Visual Studio程式码设定中设定"git.enableCommitSigning": true
    *克隆我的github存储库

通常当我在过去提交时,我会得到一个对话框,要求在提交时进行GPG认证。我现在没有得到这个,只有错误对话框。

**UPDATE:**好吧,现在我真的很困惑。我重新启动了vscode(这不是我第一次在这个过程中这样做),瞧,它工作了。我唯一能想到的是,也许我不知怎么弄错了目录?无论如何,它现在工作了。
**更新:**奇怪的是,我在一个月后又回到了这个问题上。我试过了我在这个网站上能找到的所有方法,但是没有任何效果。

我尝试过将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匹配。不知道还能用这个去哪里,因为我已经在新初始化的本地repos和我从github拉来的repos中试过了,都是用官方的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理论中所描述的here,我按照Arch Linux Wiki上演示的如何使用$ gpg-connect-agent reloadagent /bye命令重新加载gpg-agent

这没有效果

所以我可以在vscode official、oss代码和vscodium以及bash中重现这个问题,我想这可能是一个与权限相关的问题,因为linux的许多问题通常都是。我将我的用户添加到所有类型的组中,包括root,这也没有影响所以我认为我可以安全地排除以下问题:

  • VS代码
  • GnuGP语言
  • gpg-试剂
  • Linux权限

因此,我的下一个重点是配置文件本身,但正如前面所述,凭据与.gitconfig中的密钥匹配,我的.bash_profile已经正确配置了export GPG_TTY=$(tty)

官方GnuPG docs对此有一个有趣的注解,它显示了他们的方式与GitHub文档here上指示您将其附加到.bash_profile的方式之间的语法差异
来自GnuPG:“最常见的原因是环境变量GPG_TTY没有正确设置。请确保它已经设置为一个真实的的tty设备,而不仅仅是'/dev/tty';即'GPG_TTY=tty'显然是错误的;您需要的是'GPG_TTY=tty' -注意反勾号。还要确保导出此环境变量,即您应该使用'export GPG_TTY'来跟踪设置“

据我所知,bash中的$(whatever)用于执行命令,但为了安全起见,我使用两种方法附加了.bash_profile,两者都没有解决这个问题。
"最后一件事"
this post中,用户谈到当守护进程和gpg访问由另一个应用程序启动时,gpg代理身份验证不可用(比如像VSCode这样的IDE),它解释了我如何在提交一个随机文件或执行echo "test" | gpg --clearsign并通过身份验证后 * 临时 * 签署提交......但是,就像本主题的大多数其他“解决方案”一样,他们最终所要做的就是将export GPG_TTY=$(tty)添加到他们的.bash_profile中,我已经尝试过了。
"接下来该何去何从"
我仍然不能解释为什么它在我以前的安装上工作,坦白地说,并没有太多的改变。我通常经常做新鲜的安装,并保持一个相当小的arch linux构建与lts内核每次w/base-devel和nodejs/python/git/vscode/firefox/discord几乎是我的整个工作流程。我都没有主意了。

bd1hkmkf

bd1hkmkf1#

首先确保添加

export GPG_TTY=$(tty)

在您的.bashrc中
显然VSCode没有要求输入密码短语,这就是为什么它会给出错误。我不知道原因。我个人的解决方案是先做一个控制台提交,或者运行下面这行

echo "test" | gpg --clearsign

修改
为了避免每次提交时都输入密码短语,您可以让GPG记住密码短语8小时或直到下次重启:

mkdir -p ~/.gnupg
echo "default-cache-ttl 28800" >> ~/.gnupg/gpg-agent.conf

GitHub Guide

wko9yo5t

wko9yo5t2#

也许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中。

yhxst69z

yhxst69z3#

几天前,我在使用VS Code和WSL时遇到了同样的问题。问题是VS Code没有正确加载.profile文件(以及其中的所有环境变量)(尝试运行此命令,但没有得到正确的结果:echo $GPG_TTY)。幸运的是,在VS代码首选项中为shell参数设置“-l”选项对我很有效。这确保了.profile(或.zprofile)文件被成功加载。我在settings.json中添加了以下行:

"terminal.integrated.shellArgs.linux": [
    "-l"
]

确保在.profile文件中添加export GPG_TTY=$(tty),并重新启动终端和VS代码。
更新:由于VSCode不赞成使用shellArgs oprion,请使用以下代码段作为替代。

"terminal.integrated.profiles.linux": {
    "bash": {
        "path": "bash",
        "args": ["-l"],
        "icon": "terminal-bash"
    },
    "zsh": {
        "path": "zsh",
        "args": ["-l"],
    },
    "fish": {
        "path": "fish",
        "args": ["-l"],
    },
    "tmux": {
        "path": "tmux",
        "args": ["-l"],
        "icon": "terminal-tmux"
    },
    "pwsh": {
        "path": "pwsh",
        "args": ["-l"],
        "icon": "terminal-powershell"
    }
},
"terminal.integrated.defaultProfile.linux": "bash"

-l选项已添加到上述所有终端配置文件中,请删除未使用的配置文件并根据需要设置默认配置文件。

h9a6wy2h

h9a6wy2h4#

我也有同样问题,我已经解决了
项目背景

  • macOS操作系统
  • GPG套件生成GPG密钥
  • 平恩特里麦克

如何解决此问题
我看到这个answer,就跟着它走。
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是我创建secret的电子邮件,所以926E268C01892E8A2FCCD2A101CEB6267272A9A5是我需要的密钥代码。
1.让git使用此密钥。

git config --global user.signingkey 926E268C01892E8A2FCCD2A101CEB6267272A9A5

1.现在应该可以了。

git commit -S -m "This is a signed commit"

如果你需要它与Github一起使用,你需要按照本指南将你的GPG公钥添加到Github。

kmb7vmvb

kmb7vmvb5#

请先确保echo "test" | gpg --clearsign成功运行,然后再尝试以下操作。
非常有助于检查git commit在幕后做了什么。

GIT_TRACE=1 git commit -S -m "MESSAGE"

这将显示git在提交时使用的用户名、电子邮件和密钥。
在我的例子中,我发现git选择了错误的用户和密钥细节来签署提交。我主要打算使用repo的本地配置而不是全局配置,并将以下内容添加到本地git配置(位于“REPO_PATH/.git/config”)中,以使提交在Terminal和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"
ercv8c1e

ercv8c1e6#

我不知道这是不是太晚了,但是......我确实找到了一个立竿见影的解决办法。
要查看您拥有的user.name和user.email,请运行:
git config -l
你可能会注意到www.example.com有两个条目user.name。你可能犯了和我一样的错误!我把我的真实姓名而不是GitHub用户名放进去了,结果有两个条目user.name!我只是把全局user.name改回了我的github用户名,就像这样...
git config --global user.name "ghusername"
接下来,git commit,它应该可以工作:
git commit -m "<YOUR MESSAGE>"
告诉我这是否对你有用,我想知道这是否是同样的问题。

相关问题