在一个全新的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.name
和user.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几乎是我的整个工作流程。我都没有主意了。
6条答案
按热度按时间bd1hkmkf1#
首先确保添加
在您的.bashrc中
显然VSCode没有要求输入密码短语,这就是为什么它会给出错误。我不知道原因。我个人的解决方案是先做一个控制台提交,或者运行下面这行
修改
为了避免每次提交时都输入密码短语,您可以让GPG记住密码短语8小时或直到下次重启:
GitHub Guide
wko9yo5t2#
也许git找不到gpg?这是我在使用VSCode和使用Remote-Containers创建开发容器时遇到的问题。请尝试在终端中的VSCode(在容器中)中运行此命令
或您的gpg所在的位置。您可以输入
如果这样做有效,那么您可以将其放在开发容器的Dockerfile中。
yhxst69z3#
几天前,我在使用VS Code和WSL时遇到了同样的问题。问题是VS Code没有正确加载
.profile
文件(以及其中的所有环境变量)(尝试运行此命令,但没有得到正确的结果:echo $GPG_TTY
)。幸运的是,在VS代码首选项中为shell参数设置“-l”选项对我很有效。这确保了.profile
(或.zprofile
)文件被成功加载。我在settings.json
中添加了以下行:确保在
.profile
文件中添加export GPG_TTY=$(tty)
,并重新启动终端和VS代码。更新:由于VSCode不赞成使用
shellArgs
oprion,请使用以下代码段作为替代。-l
选项已添加到上述所有终端配置文件中,请删除未使用的配置文件并根据需要设置默认配置文件。h9a6wy2h4#
我也有同样问题,我已经解决了
项目背景
如何解决此问题
我看到这个answer,就跟着它走。
1.获取密钥
测试结果
1.因为
x@xxgolo.com
是我创建secret的电子邮件,所以926E268C01892E8A2FCCD2A101CEB6267272A9A5
是我需要的密钥代码。1.让git使用此密钥。
1.现在应该可以了。
注如果你需要它与Github一起使用,你需要按照本指南将你的GPG公钥添加到Github。
kmb7vmvb5#
请先确保
echo "test" | gpg --clearsign
成功运行,然后再尝试以下操作。非常有助于检查
git commit
在幕后做了什么。这将显示git在提交时使用的用户名、电子邮件和密钥。
在我的例子中,我发现git选择了错误的用户和密钥细节来签署提交。我主要打算使用repo的本地配置而不是全局配置,并将以下内容添加到本地git配置(位于“REPO_PATH/.git/config”)中,以使提交在Terminal和VSCode中都能工作
也可以使用以下命令进行设置:
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>"
告诉我这是否对你有用,我想知道这是否是同样的问题。