Git hatası - gpg veri imzalayamadı


149

Git'i kullanmaya yeni başladım ve git ve gpg'yi homebrew üzerinden yükledim. Nedense, ben git commit bu konuyla ilgili diğer birçok stackoverflow soruları baktım ve hiçbiri benim için çalıştı bu hatayı alıyorum . Başarılı bir şekilde yükleyebilmem için bu hatayı nasıl düzeltebilirim.

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

3
Mac kullanıcıları için. Bu sorunu yaşadım. Bu sayfadaki tavsiye, gpg'nin iki sürümünün yüklü olabileceğini ve yaptığımı fark etmeme yardımcı oldu. Biri demlemek, diğeri GPG Suite'ten. GPG Suite'i kullanmak istedim çünkü sistem anahtarlığında parolayı önbelleğe almasına izin veriyor. Demlemek sürümünü kaldırmak sorunlarımı çözdü. @ Sideshowbarker'ın gpg-agent'ı öldürme konusundaki cevabı ile birlikte. Bu yüzden her birinin konfigürasyonunun birbirine müdahale ettiğini varsayıyorum.
Michael Welch



Ben sadece gpg imzalama ile ilgili bir sorunla karşılaştı, sorun benim git repo yerel gpg.signingkey seti yoktu, ama gllobal biri oldu. Bu yüzden sadece git config --local user.signingkeydoğru anahtara ayarlayın ve tekrar otomatik olarak atanacaktır. ve belki küresel olanı unsetgit config --global --unset user.signingkey
MarcusJ

Yanıtlar:


210

Sorun giderme için ilk olarak denemeniz gereken iki şey:

  • koş git config --global gpg.program gpg2, git kullandığından emin olmak için gpg2değilgpg
  • koşun echo "test" | gpg2 --clearsign, gpg2çalıştığından emin olmak için

Her şey yolunda görünüyorsa, denenecek bir sonraki şey:

  • brew install pinentryparola girişi için iyi bir araç yüklü olduğundan emin olmak için çalıştırın

Bu yüklemeden sonra yeniden denerseniz git commitve yine de " failed to sign the data" hatasını alırsanız :

  • gpgconf --kill gpg-agentasılabilecek herhangi bir çalışan ajanı öldürmek için koş

Diyorsa gpgconfyüklü değil veya bir yok --killseçeneği, sen olabilir bu deneyin:

  1. cp ~/.gnupg ~/.gnupg-GOOD~/.gnupggerekirse bir kopyasını daha sonraya dönmek için kaydetmek için
  2. brew install gnupg21 2.1 yüklemek için

Senin bir kopyasını kaydetmek için bir neden ~/.gnupgdir, yani / GnuPG 2.1 potansiyel yaratmasıdır GnuPG'nin 2.0 ile geriye dönük olarak uyumlu ve daha önceki değil şekilde bazı temel verileri değiştiren eğer , daha sonra geri dönmek için yapabileceğiniz istiyorum mv ~/.gnupg ~/.gnupg21 && mv ~/.gnupg-GOOD ~/.gnupg.


Aksi takdirde çalışan bir GnuPG ortamına sahip olup olmadığınızı kontrol etmek için bazı temel adımlar vardır:

  • çalıştırmak gpg2 -K --keyid-format SHORTEn az bir anahtar çifti olup olmadığını kontrol etmesi,

Bunun çıktısı, GnuPG'nin kullanması için gizli bir anahtarınız olmadığını gösteriyorsa, bir tane oluşturmanız gerekir:

  • çalıştırmak gpg2 --gen-keyGnuPG olması, bir anahtar çifti oluşturmak için adımlarda size

“Cihaz için uygun olmayan ioctl” hatası alıyorsanız , bunu yapın:

  • çalıştırın export GPG_TTY=$(tty)ve / ~/.bashrcveya˜/.bash_profile

İkinci komutu çalıştırdığımda bu hatayı alıyorum: gpg: varsayılan gizli anahtar yok: Gizli anahtar yok gpg: [stdin]: clearsign başarısız oldu: Gizli anahtar yok
16'da Entitize

@Entitize Bu, gpg'nin imzalamak için kullanabileceğiniz herhangi bir anahtarınız olmadığını düşünüyor gibi görünüyor. Cevaba eklediğim ek adımlara bakın; daha önce hiç koşmadıysanız gpg2 --gen-key, ilk önce yapmanız gereken budur.
sideshowbarker

2
echo "test" çalıştırdığımda | gpg2 --clearsign, bana şunu verir: gpg-agent [-]: komut get_passphrase başarısız oldu: Cihaz için uygun olmayan ioctl gpg: aracıyla ilgili sorun: Aygıt için uygun ioctl gpg: varsayılan gizli anahtar yok: İşlem iptal edildi gpg: [stdin]: takas başarısız oldu: İşlem iptal edildi. Başka pek çok olasılık denedim, ama hiçbiri işe yaramıyor. GPG olmadan GIT kullanmanın bir yolu var mı?
Entitize

9
Deneyebilirsiniz export GPG_TTY=$(tty). Git'i gpg olmadan kullanmanın bir yolu olduğu gibi, bunu varsayılan olarak veya sadece git config --global commit.gpgsign falsetaahhütlerinizin küresel olarak ayarlanmamış gpg imzasını çalıştırmak için çalıştırabilmelisiniz .
sideshowbarker

10
İşte Mac OS X, beraber ayıklama başladı echo "test" | gpg2 --clearsign, bir hata buldum ve beni neden bu konuya benim sorun çözüldü,: Ben sadece bir koyun export GPG_TTY=$(tty)benim içine ˜/.bash_profileile yeniden sonra dosya vesource ˜/.bash_profile
herrera

71

Git'in hangi anahtarla imzaladığını bilmesi gerekir.

GPG, gpg-agent ve gpg.conf dosyalarınızı kurduktan sonra ( bu kılavuza bakın ), çalıştırmanız gerekir

git config --global user.signingkey EB11C755

Açıkçası, sonunda ortak anahtarı kendi anahtarınızla değiştirin. Her taahhüdün varsayılan olarak imzalanmasını istiyorsanız,

git config --global commit.gpgsign true

7
Başka birinin yaptığım şeyi yapacak kadar aptal olması durumunda bununla karşılaştım: "signinkey" değil "signkey" yazdığınızdan emin olun.
24:24

1
tam anlamıyla @ZNK tarafından yapılan bu yorum benim için yaptı. Ben "signkey" yerine "signkey"
yazmıştı

1
Kabul edilen cevap bunu ilk sorun giderme adımı olarak göstermelidir, çünkü bazen tüm anahtarlarınız zaten yerinde olabilir, sadece git hangi anahtarın kullanılacağını unutur.
f055

41

Bir şekilde git, her taahhüdü GPG imzalayacak şekilde yapılandırılmıştır. Git'i kullanmak için GPG ile imzalamak gerekli değildir. Büyük olasılıkla hata veriyor çünkü gpg imzalama mekanizmanız henüz yapılandırılmadı.

Git konusunda yeniyseniz, önce GPG imzalamadan önce çalışmasını sağlayın, ardından gerçekten ihtiyacınız varsa daha sonra oturum açın.

Git'inizin gpg ile ilgili olarak nasıl yapılandırıldığını aşağıdakileri yaparak doğrulayabilirsiniz:

git config -l | grep gpg

Aşağıdakiler dahil olmak üzere sıfır veya daha fazla satır üretebilir:

commit.gpgsign=true

"Commit.gpgsign" true olursa, gpg imzalamayı etkinleştirmiş olursunuz. Şunlarla devre dışı bırak:

git config --global --unset commit.gpgsign

Ardından taahhüdünüzü tekrar çalıştırmayı deneyin. Şimdi gpg imzalamadan çalışmalıdır. Temel git çalıştıktan sonra, karışıma geri gpg imzalamayı eklemeyi denemelisiniz.


12
Müthiş! git config --global --unset commit.gpgsignbenim için çalıştı :)
hpaknia

vay!! benim için çalıştı: git config --global --unset commit.gpgsign
Hardy Mathew

32

@Sideshowbarker ve @Xavier Ho çözümüne bakın, aşağıdaki adımları izleyerek sorunumu çözdüm.

Demlemek için gpg2'nin kurulu olduğunu varsayın,

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

sn rsa2048 / 0A61C6FC 2017-06-29 [SC] [geçerlilik süresi: 2019-06-29]

git config --global user.signingkey 0A61C6FC

Meslektaşım tarafından hatırlatıldı, eklenmesi gerekiyor

export GPG_TTY=$(tty)

zsh kullanılıyorsa ~ / .zshrc'ye, ~ / .bash_profile dosyasına ekleyin.


MacOS için,

gpg2 demlemek için gpg ile birleştirilir ve böylece gpg komutu gpg2'ye yönlendirilir

brew install gpg2

demlemek bilgi gpg

gnupg: kararlı 2.2.6 (şişelenmiş)

git config --global gpg.program gpg
gpg -K --keyid-format SHORT 

ve parola girişi için pinentry-mac var

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

Satır ekle

pinentry-program / usr / local / bin / pinentry-mac

Meslektaşım tarafından hatırlatıldı, eklenmesi gerekiyor

export GPG_TTY=$(tty)

zsh kullanılıyorsa ~ / .zshrc'ye, ~ / .bash_profile dosyasına ekleyin.


1
macOS 10.15 (Catalina), GnuPG sürüm 2.2.17 ile birlikte gönderilir; bu nedenle, güncellemeleri kendi başınıza yönetmeyi planlamıyorsanız ayrı olarak yüklemenize gerek yoktur.
Josh Habdas

18

Onu kullanıyorum. Zsha desteğine sahiptir ve Linux için Windows Alt Sisteminde çalışır:

export GPG_TTY=$(tty)

2
MacOS Catalina üzerinde zsh kullanıyorum ve işe yaraması için gereken tek değişiklik buydu. Teşekkürler.
JP Lew

Anahtarlarımı WSL ortamıma kopyaladıktan sonra OP'de hata alıyordum, anahtardaki parola için bir istem sağlamak için bunu yapmam gerekiyor. Teşekkürler.
narkotik

10

Anahtarınızın süresinin dolup dolmadığını kontrol edin. Son kullanma tarihini düzelttikten sonra (istemediğiniz sürece yeni bir anahtar oluşturmanıza gerek yoktur), gitnormal şekilde çalışır.

Süresi dolmuş anahtarı düzeltmenin bir yolu:

(Not: $komut satırı istemini temsil eder, komut isteminden sonra komutları yazın; her komutun ardından Enter tuşuna basın)

$ gpg2 --list-keysuygun anahtar kimliğini bulmanız (sonra karakterler \üzerinde publine)

$ gpg2 --edit-key <key id> - bu, gpg kabuğunu açar ve bilgi istemi gpg>

gpg> expire - birincil anahtar için yeni son kullanma tarihi ayarlamak üzere talimatları izleyin

Ardından, süresi dolmuş alt subsatırlar varsa ( satırda gösterilir), son kullanma tarihlerini de sıfırlayın:

gpg> key 1- ilk alt anahtarı seçer - alt anahtarın gpg> expireyeni son kullanma tarihini ayarlamak için talimatları izleyin

Sonraki her bir alt anahtar için gerektiği kadar tekrarlayın.


Son kullanma tarihi olmayan bir gpg anahtarı çalıştırmayı denediğimde bu sorunu yaşadım. Nedense git bunu sevmiyor. Bir son kullanma tarihi eklemek için bu yöntemi kullanmak (gelecekte ne kadar uzakta olursa olsun) sorunu çözüyor gibi görünüyor.
some_guy632

saveİşiniz bittiğinde gpg komut istemine yazmayı unutmayın !
daviewales

5

Bu benim için Ubuntu 18.04 üzerinde çalıştı

Gpg anahtarınızı kontrol edin

gpg -K --keyid-format LONG

boş bir yanıt alırsanız, bir GPG anahtarı oluşturun

gpg --generate-key

ilk komutu yeniden çalıştırdığınızda çıktıyı şu şekilde almalısınız:

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 şarkı tuşunu ayarla

git config --global user.singingkey 95A854E0593B3214

o zaman gitmek iyidir! (--global isteğe bağlıdır)

Alternatif olarak, ssh anahtarınızla imzalamayı sakıncası yoksa

git config commit.gpgsign false

burada ve burada bu soruya göre bir güvenlik sorunu nedeniyle bunun önerilmediğini unutmayın


"Alternatif olarak, ssh anahtarınızla imzalamak sakıncası yoksa" ssh imzalama ile ne ilgisi var?
riffraff

SSH'nin imza taahhütleriyle hiçbir ilgisi yoktur. GPG kesinti imzalamayı kapatmayı ve taahhütlerinizi bir git sunucusuna gerçekten ittiğinizde kimlik doğrulaması için SSH anahtarlarını kullanmaya bağlı olarak bahsediyorlar. SSH kimlik doğrulamasını kullanarak imzasız taahhütleri itmek için itebilirsiniz (ve oldukça yaygındır).
phouse512

4

Ben gpg.program gpg mutlak yolu düzeltmek zorunda kaldı:

git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"

Windows'u cygwin ile kullanıyorum.


3
Benim için çözüm buydu. Chocolatey kullanarak gnupg yükledim.
Alex S

Teşekkürler, benim için de çalıştı. Yaptığımchoco install gpg4win
Gokul NC

4

Çözüm:

Issue: Disabled loopback pinentry mode

Sorunu çözmek için ~ / .gnupg / gpg.conf dosyasında geri döngü pinentry modunu etkinleştirmeniz gerekir :

cat <<'EOF' >> ~/.gnupg/gpg.conf

use-agent 
pinentry-mode loopback

EOF

Ayrıca ~ / .gnupg / gpg-agent.conf dosyasında (zaten yoksa dosyayı oluşturun):

cat <<'EOF' >> ~/.gnupg/gpg-agent.conf

allow-loopback-pinentry

EOF

Sonra ajan ile yeniden başlatın ve echo RELOADAGENT | gpg-connect-agentgitmek için iyi olmalı!

Kaynak


1
Vay canına, mümkün olan her çözümü denedikten sonra saatler harcadıktan sonra sorunum düzeltildi, teşekkürler!
Matt

Rica ederim. Aslında kaynak sayesinde. Ben de buna takıldım.
Rahul Thakur

3

Bu hata, GPG anahtarınızın süresi dolduğunda da oluşabilir. Yeni bir anahtar oluşturmak ve Git'e eklemek bunu çözmelidir.


3

Gnupg 2.x sürümüne geçtikten sonra bu sorunu yaşadım. Gpg2'nin tuşlara farklı şekilde başvurduğu görülüyordu: Hala signingkey = ABC98F11(gpg v1 ayarı) vardı ~/.gitconfig. Gpg2 için anahtar tanımlayıcılar daha uzundur. Onlara bakgpg --list-secret-keys


1

/ / git3 için anahtarları ayrı bir anahtar yapmıştı & & anahtar (birkaç gün boyunca iyi çalıştıktan sonra) gelecekte süresi dolmuş olarak gösterdi:certifysignencrypt

pub   rsa4096/4CD1E9DA 2017-04-26 [C] [expired: 2017-04-28]
      Key fingerprint = 4670 59C1 7592 08B8 7FA5  313B 2A42 B6A6 4CD1 E9DA
uid         [ expired] Stuart Cardall (GIT Development Keys) <xxxxxx>
sub   rsa4096/5195E715 2017-04-26 [E] [expired: 2019-04-26]
sub   rsa4096/DB74C297 2017-04-26 [S] [expired: 2019-04-26]
sub   rsa2048/A3913A3C 2017-04-28 [] [expired: never     ]

sorunu çözmek için ayrı alt anahtarlar eklemeden yeni bir anahtar yaptı.


1

Git yapılandırmanız gpgsign = true olarak ayarlanmış olabilir . Taahhütlerinizi atamak istemiyorsanız yanlış olarak ayarlamayı deneyin. Havuz klasörünüze gidin ve dosyayı değiştirin

nano .git / config

Bundan...

[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

Buna...

[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

1

Benim için bu hata ile oluşmaya başladı git tag -sben den açıldığında Debian GNU / Linux üzerinde pinentry-gnome3etmek pinentry-curses(kullanarak update-alternatives --config pinentrykolay uzaktan erişim için). Sadece oluştu git tag -s, onunla değil gpg(örneğin gpg --clearsignkendisi).

Bu durumda tekrar çalışması için gereken tek değişiklik export GPG_TTY=$(tty)kabuk başlangıç ​​dosyalarıma eklemekti .

Yine de bu sorunun başka bir cevabında bu düzeltmenin göstergesi olarak belirtilen "Cihaz için uygun olmayan ioctl" hata mesajı alamadım.

Not: Bu hatayı almanın nedeni export GPG_TTY=$(tty), bu sorunun diğer cevaplarında daha önce önerilenlerden (genellikle bir yan ipucu olarak) tamamen farklı olduğundan, bu sorunun export GPG_TTY=$(tty)ana düzeltme olabilecek bir başka cevaba ihtiyacı olduğuna karar verdim. bazı durumlarda gerekli olan tek şey.


Teşekkürler! update-alternatives --config pinentrybenim için yaptım. Ben masaüstüme SSH'd ve ( SSH'd veya sanal bir konsola geçildiğinde bir TTY yedek olması gerekir)pinentry olarak ayarlanmış . Ama görünüşe göre işe yaramıyordu. Benim için hile yapmak için varsayılanı ayarlamak . Masaüstüme geri döndüğümde tekrar ayarlamam gerekebilir, ama şimdilik iyiyim. yeterli değildi. Yaptım ama taahhüdümü imzalamadan önce geçiş yapmam gerekiyordu . /usr/bin/pinentry-gnome3/usr/bin/pinentry-ttyexport GPG_TTY=$(tty)pinentry
Karl Wilbur

1

Benim için çözen şey, anahtarın adının git kullanıcı adımla eşleştiğinden emin olmaktı. E-postaların da eşleşmesi gerektiğini düşünüyorum. Bu, Mac bilgisayarımda GPG KeyChain'i kullanarak benimle ilgili olabilir. Emin değil.

Ben bu doldurdu zaman anahtarı adlandırmak düşündüm, ama sanırım benim adı (git kullanıcı adı) istiyordu.

GPG Anahtarlık formu


Bu cevabın o kadar gerisinde olması çok üzücü ki, birçok kişi burada sorununu bulamayacak.
MaciekS

1

Ben macos bu hatayı vardı - denemek ve sorunlarını gidermek için kullanma süresi dolmuş olup olmadığını görmek için anahtarları listelemeye çalıştım gpg2 --list-keys- Anahtarların süresi dolmamış ve doğru anahtarın benim yapılandırma kullanarak ayarlandığını doğruladım git config --global user.signingkey.

Bu komutları çalıştırdıktan sonra aniden tekrar sorunsuz taahhütler verebildim. Yapılandırma dosyalarımı veya anahtarlarımı değiştirmedim - yeni bir Terminal örneği bile oluşturmadım. Sadece gpg2 bir şekilde mac'umda garip bir durumdaymış gibi görünüyordu.


0

Ben yükleme sorunu çözüldü brew install gpg2sonra yapıyorgit config --global gpg.program gpg2


0

Git yapılandırmanızda anahtarın süresi dolduğunda da aynı hataya neden olabilir.

Lütfen içeriğini kontrol edin cat .git/configve signingkeydeğer olup olmadığını kontrol edin ve süresinin dolup dolmadığını kontrol edin. Evetse yenisiyle güncelleyin.


0

GPG anahtarınızı saklamak için akıllı kart / yubikey kullanıyorsanız signkeyve kartta depolanan anahtarla git yapılandırmasını ayarladıysanız (ve yukarıdaki tüm yanıt sorununuzu çözmüyor gibi görünüyorsa), kartın bloke PIN'i bu sorunun temel nedeni.

Engellenen PIN'i kontrol etmek için:

gpg --card-status

Sayaç şuna benzerse

Reader ...........: Yubico YubiKey
PIN retry counter : 3 0 3

Ardından PIN'iniz engellenir (3 başarısız denemeden sonra).

PIN'in engellemesini kaldırmak için:

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

0

Benim için basit bir brew unintstall gnupg && brew cask reinstall gpg-suitesorunu çözer.

(Benim durumumda) elle homebrew istalled gpg kaldırır ve tüm GPG Suite yeniden yükler.


0

Benim durumumda, burada taahhüt imzalama belgelerinde karışık gpg yapılandırması ve smimesign yapılandırması yaptım: https://help.github.com/en/github/authenticating-to-github/telling-git-about-your-signing- anahtar

Saatlerce üzerinde çalıştıktan sonra, gpg ile ilgili her şeyin ayarlanmadığını ve gpg'yi yeniden yapılandırdığını düzeltmenin en iyi yolunu buldum.

@Jason Thrasher'ın cevabında belirtildiği gibi, gpg ile ilgili tüm git yapılandırmasını kullanarak:

git config -l | grep gpg

Sonra her şeyi golablly olarak ve yerel olarak kullanarak:

git config --global --unset <config_name>
git config --local --unset <config_name>

Ardından, yukarıda verilen resmi belgelere göre yeniden yapılandırın. Bu yardımcı olur umarım.


Ayrıca, gpg2 kullanıyorum
Shubham Gupta

0

Pinentry ve gpg kurulumunuzu daha önce yaptıysanız ve hiçbir yerde çalışmayı durdurduysanız:

Gpg'nizin çalışıp çalışmadığını kontrol edin:

echo "test" | gpg --clearsign

O derse gpg: signing failed: No pinentry, sadece zaman zaman takılıp alır gpg cin istemcisi, yeniden başlatın:

gpgconf --kill gpg-agent

Şimdi çalışıyor olmalı:

echo "test" | gpg --clearsign

0

Benim durumumda, bu hata parola istemine sığmayan git commitküçük bir tmuxpencerede çalışırken meydana geldi .

$ 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

-6

Bu ondan kurtulmanıza yardımcı olacaktır

git config commit.gpgsign false


1
Aşağı oyu anlamıyorum, önerilen meseleyi benim için bir cazibe gibi çözdü.
Jms

2
Bu komuttan kaçınılmalıdır. Sadece git taahhüdünü imzalama gereksinimini kaldıracak, taahhütte bulunan kişinin kimliğini doğrulama sorununu çözmeyecektir.
Kyle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.