gpg nie udało się podpisać danych fatal: nie udało się zapisać obiektu zatwierdzania [Git 2.10.0]

Śledziłem kilka artykułów nad pretty atrybuty na Git 2.10 Release note. W trakcie którego zaktualizowano git do wersji 2.10.0 i wprowadzono zmiany do global .gitconfig w wyniku czego -

[filter "lfs"]
    clean = git-lfs clean %f
    smudge = git-lfs smudge %f
    required = true
[user]
    name = xyz
    email = [email protected]
    signingkey = AAAAAAA
[core]
    excludesfile = /Users/xyz/.gitignore_global
    editor = 'subl' --wait
[difftool "sourcetree"]
    cmd = opendiff \"$LOCAL\" \"$REMOTE\"
    path = 
[mergetool "sourcetree"]
    cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
    trustExitCode = true
[alias]
    lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
[color "diff"]
    old = red strike
    new = green italic

Ale teraz próbuję podpisać commity używając

git commit -a -S -m "message"

Widzę następujący błąd -

Potrzebujesz hasła, aby odblokować tajny klucz dla

User: "XYZ (digitally Signed)"

2048-bitowy klucz RSA, ID aaaaaaa, utworzono 2016-07-01

Error: gpg failed to sign the data fatal: failed to write commit obiekt

Uwaga - nadal mogę zatwierdzać zmiany używając git commit -a -m "message"

czy istnieje sposób na przezwyciężenie tego samego? Czy jakakolwiek zmiana wymagana w gpg configach, aby poradzić sobie z upgradowaniem Gita?


Aktualizacja 1

Również poszukując dalszej użyteczności, podążając czy istnieje sposób na " autosign" commity w Git z kluczem GPG?. Już skonfigurowałem klucz używając

git config --global user.signingkey ED5CDE14(with my key) 
git config --global commit.gpgsign true

I oczywiście i tak otrzymujemy ten sam błąd.

Author: Community, 2016-09-14

21 answers

Natknąłem się na ten problem z OSX.

Oryginalna odpowiedź:

Wygląda na to, że gpg update (of brew) zmienił lokalizację gpg na gpg1, możesz zmienić plik binarny, w którym git wyszukuje GPG:

git config --global gpg.program gpg1

Jeśli nie masz gpg1: brew install gpg1.

Ostatnia odpowiedź:

Wygląda na to, że gpg1 jest przestarzały/"delikatnie wypchnięty z użycia", więc prawdopodobnie powinieneś zaktualizować gpg2, niestety wymaga to jeszcze kilku kroków/trochę czas:

brew upgrade gnupg  # This has a make step which takes a while
brew link --overwrite gnupg
brew install pinentry-mac
echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
killall gpg-agent

Pierwsza część instaluje gpg2, a druga to hack wymagany do jej użycia. Aby rozwiązać problem, zobacz ta odpowiedź (choć chodzi o Linuksa nie brew), sugeruje dobry test:

echo "test" | gpg --clearsign  # on linux it's gpg2 but brew stays as gpg

Jeśli test się powiedzie (żaden błąd/wynik nie zawiera sygnatury PGP), zaktualizowano go do najnowszej wersji gpg.

Powinieneś być w stanie ponownie użyć git signing!
Warto zauważyć, że musisz mieć:

git config --global gpg.program gpg  # perhaps you had this already? On linux maybe gpg2
git config --global commit.gpgsign true  # if you want to sign every commit

Uwaga: Po uruchomiłeś podpisany commit, możesz go zweryfikować podpisanym:

git log --show-signature -1

Który będzie zawierał informacje o gpg dla ostatniego commita.

 208
Author: Andy Hayden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-19 21:34:05

Jeśli gnupg2 i gpg-agent 2.X są używane, należy ustawić zmienną środowiskową GPG_TTY.

export GPG_TTY=$(tty)

Zobacz dokumentację GPG o typowych problemach .

 162
Author: Koraktor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 18:34:30

Jeśli wszystko się nie powiedzie, użyj GIT_TRACE=1 aby sprawdzić, co git faktycznie robi:

$ GIT_TRACE=1 git commit -m "Add page that always requires a logged-in user"
20:52:58.902766 git.c:328               trace: built-in: git 'commit' '-vvv' '-m' 'Add page that always requires a logged-in user'
20:52:58.918467 run-command.c:626       trace: run_command: 'gpg' '--status-fd=2' '-bsau' '23810377252EF4C2'
error: gpg failed to sign the data
fatal: failed to write commit object

Teraz uruchom ręcznie nieudane polecenie:

$ gpg -bsau 23810377252EF4C2
gpg: skipped "23810377252EF4C2": Unusable secret key
gpg: signing failed: Unusable secret key
Okazało się, że mój klucz wygasł, więc git nie był winny.
 64
Author: Bombe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-29 20:30:23

I ' ve DONE it through this short and easy recipe:

Automatyczne podpisywanie commitów na MacOS (globalnie i z różnymi IDE):

Weź swoje signingkey w tędy.

brew install gnupg gnupg2 pinentry-mac
git config --global user.signingkey <YOUR_SIGNING_KEY>
git config --global commit.gpgsign true
git config --global gpg.program gpg

Umieść w pliku gpg.conf (edytuj plik poleceniem nano ~/.gnupg/gpg.conf):

no-tty

Umieść w pliku gpg-agent.conf (edytuj plik poleceniem nano ~/.gnupg/gpg-agent.conf):

pinentry-program /usr/local/bin/pinentry-mac
 23
Author: SHi ON,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 01:49:49

Może pomóc w zabiciu procesu gpg-agent, który może utknąć ze starymi danymi. Więc nowy gpg-agent uruchomiony prosi o hasło

 16
Author: MaximKostrikin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-01 09:32:43

/ Align = "Right" / 10 Października 2001 2016: numer 871 wspomniał o "podpisywanie przestało działać w Git 2.9.3"

Git dla Windows 2.10.1 wydany dwa dni temu (październik 2010). 4th, 2016) Naprawiono interaktywne podpisywanie GPG commitów i tagów.

Niedawna zmiana gpg-sign w git (która nie wprowadza żadnego problemu na Linuksie) ujawnia problem w sposobie, w jaki w systemie Windows nie-MSYS2-git współdziała z MSYS2-gpg.


Oryginalna ODPOWIEDŹ:

Reading " 7.4 Narzędzia Git - Podpisywanie prac ", zakładam, że masz swoje "user.signingkey" konfiguracja ustawiona.

Ostatni duży refaktoring (przed Git 2.10) wokół gpg był w commit 2f47eae2a, tutaj komunikat o błędzie został przeniesiony do gpg-interface.c

Log z tego pliku ujawnia ostatnią zmianę w commit af2b21e (Git 2.10)

Gpg2 już domyślnie używa długiego formatu, ale większość dystrybucji wydaje się nadal mieć" gpg " być starsze 1.wersja x ze względu na kompatybilność powody. Starsze wersje gpg pokazują tylko 32-bitowy short ID, co jest dość niebezpieczne.

To nie ma znaczenia dla samej weryfikacji }: jeśli weryfikacja przechodzi, podpis pgp jest dobry.
Ale jeśli nie właściwie masz już klucz i chcesz go pobrać, lub chcesz sprawdzić dokładnie, który klucz został użyty do weryfikacji i chcesz go sprawdzić, my powinien określić klucz z większą precyzją.

Więc sprawdź, jak określiłeś swój user.signingkey konfiguracja i używana wersja gpg (gpg1 lub gpg2), aby sprawdzić, czy mają one jakikolwiek wpływ na Komunikat o błędzie.

Istnieje również commit 0581b54 , który zmienia warunek Komunikatu o błędzie gpg failed to sign the data (w uzupełnieniu do commit 0d2b664):

Obecnie w ogóle nie czytamy ze stderr. Jednak będziemy chcieli w przyszłym patchu, więc to również przygotowuje nas tam (i w tym przypadku gpg robi zapis przed odczytaniem wszystkich danych wejściowych, chociaż ponownie, jest mało prawdopodobne, że klucz uid wypełni bufor rury).

Commit 4322353 pokazuje, że gpg używa teraz pliku tymczasowego, więc mogą wystąpić właściwe problemy.

Przekonwertujmy na obiekt tempfile, który obsługuje trudne sprawy dla nas, i dodać brakujące wezwanie do sprzątania.

 9
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-05 20:17:56

Natknąłem się na ten sam problem. Z przyjemnością informuję, że problem leży nie z git 2.10.0, ale z gnupg 1.4.21.

Tymczasowe obniżenie wersji gnupg do 1.4.20 naprawiło problem dla mnie.

Jeśli używasz homebrew i ulepszyłeś swoje pakiety tak jak ja, możesz po prostu uruchomić brew switch gnupg 1.4.20, aby przywrócić.

 5
Author: Arno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-21 20:43:48

Używając Cygwina, ostatnio przełączyłem się na gpg2. Potem miałem ten sam problem z podpisaniem z Gitem po ustawieniu git config gpg.program gpg2.

Spróbuj echo "test" | gpg2 --clearsign sprawdzić, czy gpg2 działa. Uważam, że najprostszym rozwiązaniem jest ustawienie git config gpg.program gpg, ponieważ to działa. Ale otrzymasz również lepszy błąd w ten sposób - np. że musisz zainstalować pinentry.

 5
Author: lucidbrot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-07 09:47:12

Jeśli adres e-mail przypisany do uid Twojego klucza GPG jest inny niż adres e-mail, którego używasz w git, musisz dodać inny identyfikator użytkownika do swojego klucza lub użyć klucza, który dokładnie pasuje.

Możesz dodać kolejny UID używając:

$ gpg --edit-key

Zobacz dla mo https://superuser.com/questions/293184/one-gnupg-pgp-key-pair-two-emails

 3
Author: JavaRocky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-16 02:03:22

Upewnij się, że masz poprawnie ustawiony adres e-mail.

git config --global user.email "[email protected]"
 2
Author: Weston Reed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 02:31:33

Miałem podobny problem z najnowszymi źródłami Gita (2.12.2) zbudowanymi wraz z najnowszymi źródłami wszystkich jego zależności (Zlib, Bzip, cURL, PCRE, ReadLine, IDN2, iConv, Unistring, itp.).

Okazuje się, że libreadline sprawiał problemy Gnupgowi:

$ gpg --version
gpg: symbol lookup error: /usr/local/lib/libreadline.so.7: undefined symbol: UP

I oczywiście próba uzyskania użytecznych informacji z Gita za pomocą -vvv nie powiodła się, więc porażka była tajemnicą.

Aby rozwiązać problem PGP z powodu ReadLine, postępuj zgodnie z instrukcjami z Can ' t update or use package manager -- błąd gpg :

W terminalu:

ls /usr/local/lib

Było tam kilka libów readline (libreadline. so. bla-bla) więc ja:

su
mkdir temp
mv /usr/local/lib/libreadline* temp
ldconfig
 2
Author: jww,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-24 08:44:54

Moje dwa grosze tutaj:

Kiedy tworzysz i dodajesz klucz do gpg-agent, definiujesz coś o nazwie passphrase. Teraz passphrase w pewnym momencie wygasa, a gpg musi wprowadzić go ponownie, aby odblokować klucz, abyś mógł zacząć ponownie podpisywać.

Kiedy używasz innego programu, który łączy się z gpg, gpg'S monit o wpisanie hasła pojawia się , a nie (zasadniczo gpg-agent, gdy daemonized nie może pokazać okna dialogowego wprowadzania w stdin).

Jednym z rozwiązań jest gpg --sign a_file.txt następnie wprowadź hasło, które wprowadziłeś podczas tworzenia klucza, a następnie wszystko powinno być w porządku (gpg-agent powinno się automatycznie podpisać)

Zobacz ta odpowiedź Jak ustawić dłuższe terminy dla hasła, aby nie trzeba było tego robić cały czas.

Lub możesz całkowicie usunąć hasło za pomocą ssh-keygen -p

 2
Author: George Daramouskas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-28 13:16:39

Powyższe odpowiedzi są świetne, ale nie działają dla mnie. Moim problemem było eksportowanie zarówno kluczy public , jak i secret .

Lista kluczy z maszyny, z której eksportujemy

$ gpg --list-keys
/home/user/.gnupg/pubring.gpg
--------------------------------
pub 1024D/ABCDFE01 2008-04-13
uid firstname lastname (description) <[email protected]>
sub 2048g/DEFABC01 2008-04-13

Eksportuj klucze

$ gpg --output mygpgkey_pub.gpg --armor --export ABCDFE01
$ gpg --output mygpgkey_sec.gpg --armor --export-secret-key ABCDFE01

Przejdź do maszyny, do której importujemy i importujemy

$ gpg --import ~/mygpgkey_pub.gpg
$ gpg --allow-secret-key-import --import ~/mygpgkey_sec.gpg
Bingo bongo, jesteś skończony!

Numer referencyjny: https://www.debuntu.org/how-to-importexport-gpg-key-pair/

Ps. Moje klucze zostały wykonane na bootcamp windows 7 i wyeksportowałem je na mój mac air (ta sama fizyczna maszyna, Inna praktycznie)

 1
Author: asus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-10 07:35:53

Got It setup by simply:

brew uninstall gpg 

brew install gpg2
 1
Author: Anurag pareek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-23 11:12:28

Bardzo podobnie jak @ birchlabs, po wielu Kopaniach / poszukiwaniach odkryłem, że nie był to GPG, a raczej GPG Suite. Zrobiłem cask reinstall gpg-suite i rozwiązało to za mnie.

 1
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-27 16:37:20

Ślad Gita był bardzo odkrywczy dla mojej sytuacji...

GIT_TRACE=1 git commit -m "a commit message"
13:45:39.940081 git.c:344               trace: built-in: git commit -m 'a commit message'
13:45:39.977999 run-command.c:640       trace: run_command: gpg --status-fd=2 -bsau 'First Last <[email protected]>'
error: gpg failed to sign the data
fatal: failed to write commit object

Musiałem wygenerować klucz początkowy dla formatu, który git sprawdzał.

gpg --quick-generate-key "First Last <[email protected]>"
Potem zadziałało.

I pamiętaj, aby zastąpić swoje imię i adres e-mail zamiast "First Last <[email protected]>"

Mam nadzieję, że to pomoże.
 1
Author: phyatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-03 17:58:57

Żadna z powyższych odpowiedzi nie pasowała do mojego problemu. My gpg binary (/usr/local/bin/gpg -> /usr/local/MacGPG2/bin/gpg2) został zainstalowany jako część GPG Suite , a nie przez brew.

Niemniej jednak, czułem, że Rada sprowadza się do: "użyj któregokolwiek gpg binary jest najnowszy dostępny na brew". Więc próbowałem:

brew update
brew upgrade git
brew install gpg

# the following are suggestions from brew's Caveats, to make `/usr/local/bin/gpg`
# point to the brew binary:
rm '/usr/local/bin/gpg'
brew link --overwrite gnupg2

Zweryfikowałem, że poprawnie zmieniłem gpg na moim $PATH aby wskazać nowy plik wykonywalny z brew:

 which gpg
/usr/local/bin/gpg
 ls -l /usr/local/bin/gpg
lrwxr-xr-x  1 burger  admin  33 Feb 13 13:22 /usr/local/bin/gpg -> ../Cellar/gnupg2/2.0.30_3/bin/gpg

I wyraźnie powiedziałem gitowi, który gpg binarny do użycie:

git config --global gpg.program gpg

Może to nie jest całkowicie wodoszczelne, ponieważ jest wrażliwe na ścieżkę. Nie posunąłem się nawet do potwierdzenia ponad wszelką wątpliwość, że git przerzucił się na wywołanie browaru gpg.

W każdym razie: nic z tego nie było wystarczające, aby ponownie podpisać moje commity.


Rzecz, która zadziałała dla mnie ostatecznie, to Aktualizacja pakietu GPG . Używałem wersji 2016.7 i stwierdziłem, że aktualizacja do 2016.10 naprawiła problem dla mnie.

Otworzyłem GPG Keychain.app i nacisnąłem " Sprawdź aktualizacje...". W nowej wersji: podpisane commity działały poprawnie.

 0
Author: Birchlabs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-13 15:57:12

Jeśli zdarzyło się to przypadkowo i działało doskonale w przeszłości, tak jak w moim przypadku, spróbuj wylogować się (cmd+shift+q) i zalogować się ponownie. Worked for me

 0
Author: ßßß,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 19:17:19

W moim przypadku żadne z rozwiązań wymienionych w innej odpowiedzi nie zadziałało. Dowiedziałem się, że problem dotyczy jednego repozytorium. Usunięcie i klonowanie repo ponownie rozwiązało problem.

 0
Author: David Miguel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-22 11:15:30

Próbowałem sporo sugestii, ale bez powodzenia, i skończyło się na tym. Wiem, że to nie jest idealne, ale chcę wrócić do pracy jak najszybciej.

git config commit.gpgsign false
 -1
Author: jacksun101,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 11:34:34

Sprawdź czy gpg jest włączone używając poniższego polecenia

git config -l | grep gpg

Jeśli zwróci true, uruchom poniższą komendę, aby ją wyłączyć

git config --global --unset commit.gpgsign

Po pomyślnym uruchomieniu powyższego polecenia, powinieneś być w stanie uruchomić polecenie git commit.

 -1
Author: Aarif1430,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-20 06:46:49