我刚开始使用git,我通过自制软件安装git和gpg.由于某种原因,我在得到这个错误时,git commit
我看了很多关于这个主题的其他stackoverflow问题,但没有一个对我有用.如何修复此错误以便我可以成功上传.
error: gpg failed to sign the data
fatal: failed to write commit object
Run Code Online (Sandbox Code Playgroud)
sid*_*ker 164
要进行故障排除,首先要尝试两件事:
git config --global gpg.program gpg2,以确保git使用gpg2而不是gpgecho "test" | gpg2 --clearsign,以确保gpg2自己的工作如果这一切看起来都很好,那么接下来要尝试一下:
brew install pinentry以确保为密码输入安装了一个好的工具如果在安装之后又重新尝试git commit并仍然出现" failed to sign the data"错误:
gpgconf --kill gpg-agent以杀死任何可能挂起的正在运行的代理程序如果说gpgconf未安装或没有--kill选项,您可以尝试这样做:
cp ~/.gnupg ~/.gnupg-GOOD~/.gnupg如果需要,保存您的副本以便稍后恢复brew install gnupg21 安装GnuPG 2.1保存~/.gnupgdir 副本的原因是GnuPG 2.1可能以与GnuPG 2.0及更早版本不向后兼容的方式创建/更改某些关键数据,因此如果您想稍后返回,则可以执行此操作mv ~/.gnupg ~/.gnupg21 && mv ~/.gnupg-GOOD ~/.gnupg.
否则,运行一些基本步骤来检查您是否有一个可用的GnuPG环境:
gpg2 -K --keyid-format SHORT,检查您是否至少有一个密钥对如果输出显示您没有GnuPG使用的密钥,那么您需要创建一个:
gpg2 --gen-key,让GnuPG引导您完成创建密钥对的步骤如果您收到错误消息"不适当的设备ioctl",请执行以下操作:
export GPG_TTY=$(tty)和/或将其添加到您的~/.bashrc或˜/.bash_profile Xav*_* Ho 57
Git需要知道它与哪个密钥签约.
设置GPG,gpg-agent和gpg.conf文件(请参阅本指南)后,您需要运行
git config --global user.signingkey EB11C755
Run Code Online (Sandbox Code Playgroud)
显然,最后用自己的公钥替换公钥.如果您希望默认情况下对每个提交进行签名,请使用
git config --global commit.gpgsign true
Run Code Online (Sandbox Code Playgroud)
Jas*_*her 31
不知何故,你的git配置为GPG签署每个提交.使用git提交或推送不需要使用GPG进行签名.它可能会出错,因为您的gpg签名机制尚未配置.
如果你是git的新手,首先尝试让它在没有GPG签名的情况下首先运行,然后在你真正需要时添加签名.
您可以通过执行以下操作来验证git如何配置gpg:
git config -l | grep gpg
Run Code Online (Sandbox Code Playgroud)
这可能产生零线或多线,包括:
commit.gpgsign=true
Run Code Online (Sandbox Code Playgroud)
如果"commit.gpgsign"为true,则表示您已启用gpg签名.禁用它:
git config --global --unset commit.gpgsign
Run Code Online (Sandbox Code Playgroud)
然后尝试再次运行您的提交.现在应该在没有gpg签名的情况下运行.在你得到基本的git工作之后,你应该尝试添加gpg签名回混.
V-S*_*SHY 24
请参阅@sideshowbarker和@Xavier Ho解决方案,我通过以下步骤解决了我的问题.
假设brew安装了gpg2,
git config --global gpg.program gpg2
brew install pinentry
gpgconf --kill gpg-agent
gpg2 -K --keyid-format SHORT
// no key found then generate new one
gpg2 --gen-key
gpg2 -K --keyid-format SHORT
Run Code Online (Sandbox Code Playgroud)
... /.GnuPG的/ pubring.gpg
sec rsa2048/0A61C6FC 2017-06-29 [SC] [expires:2019-06-29]
git config --global user.signingkey 0A61C6FC
Run Code Online (Sandbox Code Playgroud)
我的同事提醒,需要追加
export GPG_TTY=$(tty)
Run Code Online (Sandbox Code Playgroud)
到〜/ .zshrc如果使用zsh,否则追加到〜/ .bash_profile
gpg2与brew中的gpg结合使用,因此gpg命令指向gpg2
brew install gpg2
Run Code Online (Sandbox Code Playgroud)
brew info gpg
gnupg:稳定2.2.6(瓶装)
git config --global gpg.program gpg
gpg -K --keyid-format SHORT
Run Code Online (Sandbox Code Playgroud)
并且有passntry-mac用于密码输入
brew install pinentry-mac
vim ~/.gnupg/gpg-agent.conf
Run Code Online (Sandbox Code Playgroud)
添加行
pinentry-program/usr/local/bin/pinentry-mac
我正在使用它。它支持zsha,并且可以在Linux的Windows子系统上运行:
export GPG_TTY=$(tty)
Run Code Online (Sandbox Code Playgroud)
Issue: Disabled loopback pinentry mode
Run Code Online (Sandbox Code Playgroud)
要解决此问题,您需要在~/.gnupg/gpg.conf 中启用环回 pinentry 模式:
Issue: Disabled loopback pinentry mode
Run Code Online (Sandbox Code Playgroud)
并且还在~/.gnupg/gpg-agent.conf(如果文件不存在则创建该文件):
cat <<'EOF' >> ~/.gnupg/gpg.conf
use-agent
pinentry-mode loopback
EOF
Run Code Online (Sandbox Code Playgroud)
然后重新启动代理,
echo RELOADAGENT | gpg-connect-agent你应该很高兴!
如果它曾经有效但只是显示失败,请终止代理并重试:
gpgconf --kill gpg-agent
Run Code Online (Sandbox Code Playgroud)
检查代理是否再次启动:
echo "test" | gpg --clearsign
Run Code Online (Sandbox Code Playgroud)
我必须将 gpg.program 修复为 gpg 的绝对路径:
git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
Run Code Online (Sandbox Code Playgroud)
我正在使用带有 cygwin 的 Windows。
如果您之前设置过 pinentry 和 gpg,但它突然停止工作:
检查你的 gpg 是否正常工作:
echo "test" | gpg --clearsign
Run Code Online (Sandbox Code Playgroud)
如果显示gpg: signing failed: No pinentry,只需重新启动 gpg 守护进程客户端即可,该客户端有时会卡住:
gpgconf --kill gpg-agent
Run Code Online (Sandbox Code Playgroud)
现在它应该可以工作了:
echo "test" | gpg --clearsign
Run Code Online (Sandbox Code Playgroud)
检查您的密钥是否过期。一旦确定了失效日期(除非您愿意,否则无需创建新密钥),便git可以正常工作。
解决过期密钥的一种方法:
(注意:$代表命令行提示符,在提示符后键入命令;在每个命令后按Enter)
$ gpg2 --list-keys找到相应的密钥ID(后面的字符\上pub线)
$ gpg2 --edit-key <key id> -这将打开gpg shell,提示更改为 gpg>
gpg> expire -按照说明为主键设置新的到期日期
接下来,如果有子项已过期(sub显示在行中),也要重置其失效日期:
gpg> key 1-选择第一个子项
gpg> expire-按照说明为子项设置新的到期日期
根据需要对每个后续子项重复。
这在 ubuntu 18.04 上对我有用
检查您的 gpg 密钥
gpg -K --keyid-format LONG
Run Code Online (Sandbox Code Playgroud)
如果你得到一个空白的响应,生成一个 GPG 密钥
gpg --generate-key
Run Code Online (Sandbox Code Playgroud)
重新运行第一个命令,你应该得到如下输出:
sec rsa3072/95A854E0593B3214 2019-05-06 [SC] [expires: 2021-05-05]
AF2F7514568DC26B0EB97B9595A854E0593B74D8
uid [ultimate] yourname<your_email>
ssb rsa3072/EFD326E6C611117C 2019-05-06 [E] [expires: 2021-05-05]
Run Code Online (Sandbox Code Playgroud)
设置 git 签名密钥
git config --global user.signingkey 95A854E0593B3214
Run Code Online (Sandbox Code Playgroud)
那你就可以走了!(--global是可选的)
或者,如果您不介意使用 ssh 密钥进行签名
git config commit.gpgsign false
Run Code Online (Sandbox Code Playgroud)
请注意,根据此处和此处的此问题,由于存在安全问题,因此不建议这样做
使用GIT_TRACE=1查看 Git 失败的位置,然后检查 Git 使用的所有自定义配置以及它们的定义位置,然后根据您的需要使用以下命令进行覆盖:
GIT_TRACE=1 git commit -S -m "this will tell you wich intern git command failed"
git config --list --show-scope --show-origin
Run Code Online (Sandbox Code Playgroud)
对我来说,我有error: gpg failed to sign the dataandfatal: failed to write commit object因为 Git 由于某种原因默认使用smimesign,即使我取消设置gpg.x509.programkey ,smimesign也找不到我的 key。
所以我必须明确告诉 Git 使用gpg来代替:
git config --local gpg.x509.program gpg
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44637 次 |
| 最近记录: |