Podpisanie polecenia git nie powiodło się: klucz tajny jest niedostępny

87

Otrzymuję ten błąd podczas próby zatwierdzenia za pomocą Git.

gpg: skipped "name <[email protected]>": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
fatal: failed to write commit object

Wygenerowałem nowy klucz, jak poniżej, ale nadal daje ten sam błąd

gpg --list-keys
~/.gnupg/pubring.gpg
--------------------------------
pub   2048R/35F5FFB2 2016-04-23
uid                  name (New key) <[email protected]>
sub   2048R/112A8C2D 2016-04-23

Tajny klucz jest taki sam jak powyżej

Znalazłem to Generowanie klucza GPG do tagowania git i postępowałem zgodnie z instrukcjami, ale nadal nie działa, jakiś pomysł?

Emilio Menéndez
źródło
3
W przypadku użytkowników systemu Windows ten błąd jest znacznie bardziej prawdopodobny, ponieważ Git w systemie Windows nie używa prawidłowego gpg. Nie znajdując poprawnego pliku binarnego w PATH, git ucieka się do używania wewnętrznie dołączonego gpg w swoim zminimalizowanym MSYS, który nie ma wiedzy o tym, gdzie są twoje klucze. Ustawienie zmiennych gpg.program lub G (NU) PGHOME rozwiązałoby problem, jak określono w kilku z poniższych odpowiedzi.
Abel Cheung

Odpowiedzi:

79

Musisz skonfigurować tajny klucz przed jego użyciem.

git config user.signingkey 35F5FFB2

Lub zadeklaruj to globalnie, jeśli chcesz używać tego samego klucza dla każdego repozytorium.

git config --global user.signingkey 35F5FFB2

Źródło: Git Tools - Signing Your Work

Leonardo Emanuel Alifraco
źródło
Bardzo dziękuję Leonardo! To działa!! Przepraszam, jeśli pytanie było głupie, nie miałem pojęcia, jak je rozwiązać.
Emilio Menéndez
Świetny! Określenie klucza podpisywania użytkownika spowoduje również obejście wielu adresów e-mail na jednym kluczu i niezgodności między adresem e-mail git a pierwszym adresem w kluczu.
user2943160
1
Czy przechowywanie pliku .gitconfig z tajnym kluczem w publicznym repozytorium jest bezpieczne?
melihovv
1
do wiadomości, jak @melihovv zapytał o: - Tajny klucz musi znajdować się w twojej bazie kluczy GPG. Tylko identyfikator skrótu tego klucza jest przechowywany w pliku config.
BRPocock
2
Musiałem to zrobić razem z git config --global gpg.program gpg2.
Splaktar
112

To zadziałało dla mnie w systemie Windows 10 (zwróć uwagę, że używam bezwzględnej ścieżki do gpg.exe):

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

To był błąd, który otrzymałem przed naprawą:

gpg: skipped "3E81C*******": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
fatal: failed to write commit object
Wakeel
źródło
2
Mam ten błąd secret key not availablez VS Code i ustawienie gpg.exelokalizacji rozwiązało go.
Dawid
2
To zadziałało również dla mnie. Zwłaszcza po wykonaniu kroków konfiguracyjnych z samego githuba .
Bas G
1
Za każdym razem, gdy instaluje się moja kompilacja Windows Insider, ta opcja jest resetowana. Dzięki za to :)
VRG
To zadziałało również dla mnie po dodaniu bezwzględnej ścieżki gpg. Wielkie dzięki.
Adarsh ​​Srivastava
tak, jest to ważne, ponieważ git ma własne gpg i większość ludzi zainstaluje gpg dla Windows i zaimportuje klucz prywatny przez kleopatrę, a tylko „główny” gpg zna lokalizację klucza. Świetna odpowiedź
Paweł Cioch
64

U mnie zadziałało dodawanie

git config --global gpg.program "C:/Program Files (x86)/GNU/GnuPG/gpg2.exe"

Jeśli chcesz znaleźć pełną ścieżkę do pliku gpg2.exe:

where gpg2.exe
Paul van Bladel
źródło
3
W zależności od zainstalowanej wersji GnuPG, musisz to zrobić gpg.exezamiast gpg2.exe.
Mark Rotteveel,
14

Lubię uzupełniać wszystkie te odpowiedzi, ponieważ mam z tym wiele problemów.

Te przykłady używają --globalflagi, ale możesz ją usunąć, jeśli chcesz to zrobić lokalnie.

Skonfiguruj tajny klucz w git

git config --global user.signingkey 35F5FFB2

Skonfiguruj program witch gpg do użycia w git (opcjonalnie)

Niektóre systemy (Ubuntu dla exemple) mogą mieć gpgi gpg2w tym samym czasie. Musisz określić, że będziesz używaćgpg2

git config --global gpg.program gpg2

Eksportuj GPG_TTY (opcjonalnie)

Jeśli użyjesz tej komendy w środowisku ssh, może wystąpić następujący błąd: Inappropriate ioctl for devicelub gpg: échec de la signature : Ioctl() inapproprié pour un périphérique. Można to naprawić poprzez:

export GPG_TTY=$(tty)

Automatyczne włączanie śpiewu GPG (opcjonalnie)

git config --global commit.gpgsign true
alphayax
źródło
Jak to wyłączyć, jeśli nie chcesz już go używać?
Madona Syombua
1
Możesz dodać --unsetflagę do tych git configpoleceń, aby je wyłączyć
alphayax
Właściwie użyłem tej konfiguracji git --global commit.gpgsign true, ale powiedziałem false.
Madona Syombua
7

Miałem sytuację, w której to samo działo się ze mną na komputerze z systemem Windows 10.

$ git commit -m "Improve logging, imports and show time executed"
gpg: signing failed: Operation cancelled
gpg: signing failed: Operation cancelled
error: gpg failed to sign the data
fatal: failed to write commit object

Polecenia "C:\Program Files (x86)\GnuPG\bin\gpg.exe" --list-secret-keys --keyid-format LONGi gpg --list-secret-keys --keyid-format LONGgdzie dają mi kompletne różne wyniki!

$ where gpg
C:\Program Files\Git\usr\bin\gpg.exe
C:\Program Files (x86)\GnuPG\bin\gpg.exe

Główny powód był związany z poprzednimi odpowiedziami, ale w innym sensie:

  • Tworzyłem klucze gpg przy użyciu git (skonfigurowanej ścieżki) wersji GPG
  • Git został skonfigurowany do używania pobranej wersji gpg do zatwierdzenia.
  • Wydaje się, że implementacje GPG używają własnej bazy danych i magazynu certyfikatów.

Mam nadzieję, że może to pomóc każdemu, kto natknie się na tę wiadomość, a poprzednie odpowiedzi nie rozwiązują jego problemu.

will824
źródło
Musiałem dodać tajny klucz do Kleopatry z eksportu CLI, ponieważ społeczność Visual Studio wydaje się używać go domyślnie do podpisywania, podczas gdy jako Git CLI używała innej listy / implementacji i dlatego nadal działała bez Kleopatry.
Nithish
5

Musisz ustawić zmienną GNUPGHOME. Bez tego GnuPG nie będzie w stanie znaleźć twoich kluczy.

# On unix add it to your path

# On windows it will usually be under: 
<drive>:\Users\<username>\AppData\Roaming\gnupg

W systemie Unix po prostu dodaje go do ścieżki.
W systemie Windows musisz otworzyć panel sterowania i ustawić go jako

System Variable
  Name: GNUPGHOME
  Path: <drive>:\Users\<username>\AppData\Roaming\gnupg
CodeWizard
źródło
1
Dla mnie tak nie było GNUPGHOME. U GPGHOMEmnie to działa
Sysix
1

Miałem ten sam problem, że nazwa gita i sklep e-mail w .gitconfig różniły się od tych z dostarczonego klucza gpg. Zmieniłem je, żeby pasowały i zaczęło działać.

Patricio Perpetua
źródło
1

Użycie "C:\Program Files\Git\usr\bin\gpg.exe"było dla mnie rozwiązaniem.
Musiałem odinstalować Kleopatrę. Z tym to nie działało.

Podsumowując;

  • Nie ma potrzeby kleopatry, zamiast tego użyj domyślnego GIT.

  • git config --global user.signingkey Y0URK3Y
    git config --global commit.gpgsign true
    git config --global gpg.program "C:\Program Files\Git\usr\bin\gpg.exe"
    
António Almeida
źródło
-4

Może musisz sklonować własne repozytorium, do którego masz prawa. Miałem ten problem, gdy sklonowałem repozytorium innej osoby.

user6671429
źródło