linux - 'Git : gpg failed to sign the data' in visual studio code

标签 linux git visual-studio-code gnupg

全新安装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

yikes。此外我找不到复制输出日志的方法,也找不到该日志在哪里,所以这是一张图片:

output log

我到目前为止已采取的步骤:
  • 在gnugp中生成了新 key (RSA 4096)
  • 将签名 key 添加到全局.gitconfig
  • 在Visual Studio代码设置
  • 中设置"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匹配。不确定该版本还有什么其他用途,因为我已经在新初始化的本地存储库中尝试了该存储库,并且在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和,这也对无效,因此我认为可以放心排除以下情况:
  • VS代码
  • GnuGP
  • gpg-agent
  • Linux权限

  • 因此,我的下一个重点是配置文件本身,但是正如凭据与.gitconfig中的 key 匹配以及我的.bash_profile已使用export GPG_TTY=$(tty)正确配置之前所述。

    官方GnuPG docs上的一个有趣的注释显示了它们的方式之间的语法差异,以及指示您将此方式附加到GitHub docs上的.bash_profile的方式之间的语法差异。here

    From GnuPG: "The far most common reason for this is that the environment variable GPG_TTY has not been set correctly. Make sure that it has been set to a real tty device and not just to ‘/dev/tty’; i.e. ‘GPG_TTY=tty’ is plainly wrong; what you want is ‘GPG_TTY=tty’ — note the back ticks. Also make sure that this environment variable gets exported, that is you should follow up the setting with an ‘export GPG_TTY’"



    据我了解,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/

    相关文章:

    linux - fork wget 具有控制特定下载的能力

    python - 分布式状态

    linux - 如何在unix中获取不同日期的列表和每个日期的记录数

    linux - 为什么 os.Open 在打开目录时返回 nil 错误?

    git - 如何更新git克隆?

    visual-studio-code - 检查当前是否在 VS 扩展中按下了控制/命令键

    git - 如何使用git将一个分支重置为另一个分支?

    git - 这些 git 符号是什么意思?

    visual-studio-code - 是否有在分割窗口 Pane 之间切换的热键?

    python - 每当在 VSCode/Python 中遇到断点时运行代码