Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git错误-gpg无法对数据进行签名_Git_Gnupg - Fatal编程技术网

Git错误-gpg无法对数据进行签名

Git错误-gpg无法对数据进行签名,git,gnupg,Git,Gnupg,我刚开始使用git,并通过自制安装git和gpg。 出于某种原因,我在执行git commit时出现了这个错误 我看了那么多关于这个话题的其他问题,没有一个对我有用。 如何修复此错误以便成功上载 error: gpg failed to sign the data fatal: failed to write commit object 对于故障排除,首先要尝试两件事: 运行git config--global gpg.program gpg2,以确保git使用gpg2而不是gpg 运行ec

我刚开始使用git,并通过自制安装git和gpg。 出于某种原因,我在执行git commit时出现了这个错误 我看了那么多关于这个话题的其他问题,没有一个对我有用。 如何修复此错误以便成功上载

error: gpg failed to sign the data
fatal: failed to write commit object

对于故障排除,首先要尝试两件事:

  • 运行
    git config--global gpg.program gpg2
    ,以确保git使用
    gpg2
    而不是
    gpg
  • 运行
    echo“test”| gpg2--clearsign
    ,以确保
    gpg2
    本身工作正常
如果一切看起来都正常,那么下一步要做的是:

  • 运行
    brew install pinentry
    ,确保已安装用于输入密码短语的良好工具
如果在该安装之后,您重新尝试
git commit
,但仍然收到“
未能对数据签名”错误:

  • 运行
    gpgconf--kill gpg agent
    以杀死任何可能挂起的正在运行的代理
如果上面说未安装
gpgconf
或没有
--kill
选项,您可以尝试以下操作:

  • cp~/.gnupg~/.gnupg GOOD
    保存
    ~/.gnupg
    的副本,以便在以后需要时还原到
  • brew安装gnupg21
    安装GNUPG2.1
  • 保存
    ~/.gnupg
    目录副本的原因是,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\u TTY=$(TTY)
      和/或将其添加到您的
      ~/.bashrc
      ~/.bash\u配置文件中

    不知何故,您的git被配置为对每次提交进行GPG签名。使用git提交或推送不需要使用GPG签名。很可能是由于您的gpg签名机制尚未配置而出现错误

    如果您是git新手,请尝试先让它工作起来,而不要先进行GPG签名,如果确实需要,请稍后添加登录

    您可以通过执行以下操作来验证git是如何配置gpg的:

    git config -l | grep gpg
    
    可能产生零行或多行,包括:

    commit.gpgsign=true
    
    如果“commit.gpgsign”为true,则启用了gpg签名。使用以下命令禁用它:

    git config --global --unset commit.gpgsign
    

    然后再次尝试运行提交。它现在应该在没有gpg签名的情况下运行。在基本git工作之后,应该尝试将gpg签名添加回混合中

    Git需要知道它是用哪个密钥签名的

    设置好GPG、GPG代理和GPG.conf文件(请参阅)后,需要运行

    git config --global user.signingKey EB11C755
    
    显然,最后用您自己的公钥替换公钥。如果希望默认情况下对每个提交进行签名,请使用

    git config --global commit.gpgsign true
    


    $gpg2-K--keyid format SHORT#我制作了一个
    git
    密钥,其中有3个单独的密钥用于
    认证
    /
    签名
    /
    加密
    &该密钥在未来显示为过期(在正常工作几天后):

    pub rsa4096/4CD1E9DA 2017-04-26[C][到期日期:2017-04-28]
    钥匙指纹=4670 59C1 7592 08B8 7FA5 313B 2A42 B6A6 4CD1 E9DA
    uid[过期]Stuart Cardall(GIT开发密钥)
    子rsa4096/5195E715 2017-04-26[E][到期日期:2019-04-26]
    sub-rsa4096/DB74C297 2017-04-26[S][到期日期:2019-04-26]
    sub-rsa2048/A3913A3C 2017-04-28[]已到期:未到期]
    

    创建了一个新密钥,但没有添加单独的子密钥来解决此问题。

    检查您的密钥是否过期。一旦您确定了过期日期(除非您愿意,否则无需创建新密钥),
    git
    将正常工作

    修复过期密钥的一种方法:

    (注意:
    $
    表示命令行提示,在提示后键入命令;在每个命令后按Enter键)

    $gpg2——列出键
    以查找相应的键id(在
    pub
    行上
    \
    之后的字符)

    $gpg2——编辑键
    -这将打开gpg外壳,提示更改为
    gpg>

    gpg>过期
    -按照说明为主键设置新的过期日期

    接下来,如果有过期的子项(
    sub
    显示在行上),也重置它们的过期日期:

    gpg>键1
    -选择第一个子键
    gpg>过期
    -按照说明为子密钥设置新的过期日期


    根据需要,对每个后续子项重复此操作。

    GPG密钥过期时也可能发生此错误。生成一个新密钥并将其添加到Git应该可以解决这个问题。

    参考@sideshowbarker和@Xavier Ho solution,我通过以下步骤解决了我的问题

    假设gpg2由brew安装

    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 
    
               
    
    …/.gnupg/pubring.gpg

    sec rsa2048/0A61C6FC2017-06-29[SC][到期日期:2019-06-29]

    同事提醒,需要追加

    export GPG_TTY=$(tty)
    
    export GPG_TTY=$(tty)
    
    如果使用zsh,则附加到~/.zshrc,否则附加到~/.bash_配置文件


    对于macOS, gpg2与brew中的gpg组合,因此gpg命令指向gpg2

    brew install gpg2
    
    brew信息gpg

    gnupg:稳定2.2.6(瓶装)

    还有pinentry mac用于输入密码短语

    brew install pinentry-mac
    vim ~/.gnupg/gpg-agent.conf
    
    添加行

    pinentry计划/usr/local/bin/pinentry mac

    同事提醒,需要追加

    export GPG_TTY=$(tty)
    
    export GPG_TTY=$(tty)
    
    如果使用zsh,则附加到~/.zshrc,否则附加到~/.bash_profile

    可能是您的Git配置文件
    brew install pinentry-mac
    vim ~/.gnupg/gpg-agent.conf
    
    export GPG_TTY=$(tty)
    
    [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
    [remote "origin"]
        url = git@bitbucket.org:yourrepo/project.git
        fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
        remote = origin
        merge = refs/heads/master
    [user]
        signingkey = <GPG-KEY>
    [commit]
        gpgsign = true
    
    [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
    [remote "origin"]
        url = git@bitbucket.org:yourrepo/project.git
        fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
        remote = origin
        merge = refs/heads/master
    [user]
        signingkey = <GPG-KEY>
    [commit]
        gpgsign = false
    
    export GPG_TTY=$(tty)
    
    gpg -K --keyid-format LONG
    
    gpg --generate-key
    
    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]
    
    git config --global user.signingkey 95A854E0593B3214
    
    git config commit.gpgsign false
    
    git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
    
    gpg --card-status
    
    Reader ...........: Yubico YubiKey
    PIN retry counter : 3 0 3
    
    gpg --card-edit
    gpg/card> admin
    Admin commands are allowed
    
    gpg/card> passwd
    gpg: OpenPGP card no. … detected
    
    1 - change PIN
    2 - unblock PIN
    3 - change Admin PIN
    4 - set the Reset Code
    Q - quit
    
    Your selection? 2
    PIN unblocked and new PIN set.
    
    1 - change PIN
    2 - unblock PIN
    3 - change Admin PIN
    4 - set the Reset Code
    Q - quit
    
    Your selection? q
    
    Issue: Disabled loopback pinentry mode
    
    git config -l | grep gpg
    
    git config --global --unset <config_name>
    git config --local --unset <config_name>
    
    $ echo "test" | gpg --clearsign
    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA256
    
    test
    gpg: signing failed: Screen or window too small
    gpg: [stdin]: clear-sign failed: Screen or window too small
    
    error: gpg failed to sign the data
    fatal: failed to write commit object
    
    sudo apt install pinentry-tty
    sudo update-alternatives --config pinentry
    
    git commit -m "test signing"
    gpg: skipped "***63231079***": No secret key
    gpg: signing failed: No secret key
    error: gpg failed to sign the data
    fatal: failed to write commit object
    
    [user]
        signingkey = 63231079
    
    gpgconf --kill gpg-agent
    
    echo "test" | gpg --clearsign
    
    GIT_TRACE=1 git commit -S -m "this will tell you wich intern git command failed"
    
    git config --list --show-scope --show-origin
    
    git config --local gpg.x509.program gpg