Reputation: 2275
I installed GPG from brew.
brew install gpg
It is gnupg2-2.0.30_2.
When I commit, I do get a error message:
You need a passphrase to unlock the secret key for
user: "Max Mustermann (mycomment) <[email protected]>"
2048-bit RSA key, ID 1111AAAA, created 2017-01-05
error: gpg failed to sign the data
fatal: failed to write commit object
I used the command:
gpg --list-secret-keys | grep ^sec
and it gives me back:
sec 2048R/1111AAAA 2017-01-05
Then I used this command:
git config --global user.signingkey 1111AAAA
commit gives me back the same error message.
How can I solve this problem?
Upvotes: 116
Views: 70242
Reputation: 3454
I encountered the same problem after upgrading my system to macOS Sonoma (version 14.0). Despite having pinentry-mac
installed and correctly configured git
and gpg-agent.conf
files, I was still facing issues with GPG signing in Git. None of the suggestions above helped.
I decided to upgrade pinentry-mac
:
brew upgrade pinentry-mac
This resolved the issue for me. It seems that the previous version of pinentry-mac
was not fully compatible with macOS Sonoma. So, if you're experiencing similar problems, make sure you have the latest version of pinentry-mac
installed on your system.
Upvotes: 0
Reputation: 1598
As can be seen in many answers here, there may be multiple issues causing this and also multiple solutions for each of those issues.
I recommend you to first know what's the actual issue before trying out a solution
To do so, you can enable GIT_TRACE
and run the commit command
GIT_TRACE=1 git commit
Credits go to this awesome gist
Then you'll see the actual command invoked by git
to sign:
10:37:22.346480 run-command.c:637 trace: run_command: gpg --status-fd=2 -bsau <your GPG key>
With that only, you can see if the GPG key used by
git
is the correct one. If not, you know there's something fishy in yourgit
config
Execute that command to see more details about the error
gpg --status-fd=2 -bsau <your GPG key>
In my case it was something about inappropriate ioctl for device
. So could start looking out around what was causing this
Actually, didn't find anything out there apart from being something related to
pinentry
. I don't want to configure anypinentry
things as per my experience it's easy to mess it up. Furthermore, I know installinggpg-suite
brew
's cask works like a charm. It even comes with a script to fix invalidpinentry
configs. So started figuring out if something else was installed that was disturbinggpg-suite
defaults.Eventually found out that
gpgme
&gnupg
were installed due to being a dependency ofpoppler
cask that had installed recently. Uninstalledpoppler
,gpgme
&gnupg
, reinstalledgpg-suite
and everything worked again 🎉
Upvotes: 1
Reputation: 6425
To anybody who is facing this issue on MacOS machines, try this:
brew uninstall gpg
brew install gpg2
brew install pinentry-mac
(if needed)gpg --full-generate-key
Create a key by using an algorithm.gpg --list-keys
git config --global user.signingkey <Key from your list>
git config --global gpg.program /usr/local/bin/gpg
git config --global commit.gpgsign true
gpg --armor --export <key>
and add this key to GitHub at GPG keys: https://github.com/settings/keys (with START and END line included)If the issue still exists:
test -r ~/.bash_profile && echo 'export GPG_TTY=$(tty)' >> ~/.bash_profile
echo 'export GPG_TTY=$(tty)' >> ~/.profile
If the issue still exists:
Install https://gpgtools.org and sign the key that you used by pressing Sign from the menu bar: Key->Sign
If the issue still exists:
Go to: your global .gitconfig
file which in my case is at: /Users/gent/.gitconfig
And modify the .gitconfig file (please make sure Email and Name are the same with the one that you have created while generating the Key):
[user]
email = [email protected]
name = Gent
signingkey = <YOURKEY>
[gpg]
program = /usr/local/bin/gpg
[commit]
gpsign = true
gpgsign = true
[filter "lfs"]
process = git-lfs filter-process
required = true
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
[credential]
helper = osxkeychain
p.s I took this answer from my previous answer here: gpg failed to sign the data fatal: failed to write commit object [Git 2.10.0]
Upvotes: 99
Reputation: 6436
To solve this issue without killing gpg-agent
on every restart:
Check if you have multiple copies of gpg
and gpg-agent
:
$ which -a gpg-agent
/opt/homebrew/bin/gpg-agent
/usr/local/MacGPG2/bin/gpg-agent
$ which -a gpg
/opt/homebrew/bin/gpg
/usr/local/bin/gpg
/usr/local/bin/gpg
For me, there were some leftover binaries from old Macbook migrations installed by MacGPG2
.
Removing those binaries (and symlinks) and checking again to make sure there is only one copy:
$ which -a gpg
/opt/homebrew/bin/gpg
$ which -a gpg-agent
/opt/homebrew/bin/gpg-agent
Then restart your computer one last time.
gpg
should sign correctly without needing to kill anything:
$ echo "test" | gpg --clearsign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
test
-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org
iQIzBAEBCgAdFiEE1S8n.....
-----END PGP SIGNATURE-----
Upvotes: 0
Reputation: 2185
If this happens to you after installing Xcode, your git binary may have been replaced. (This particular solution assumes you are managing your git install with homebrew.)
Symptoms:
error: gpg failed to sign the data
fatal: failed to write commit object
$ git config --global gpg.program
throws an error$ which git
/usr/bin/git # should be /usr/local/bin/git with homebrew
$ ls -l $(which git)
-rwxr-xr-x 1 root wheel 167072 Feb 6 2022 /usr/bin/git
# should be a symbolic link with homebrew:
# lrwxr-xr-x 1 user admin 28 Aug 16 12:11 /usr/local/bin/git -> ../Cellar/git/2.37.2/bin/git
$ git --version
git version 2.32.1 (Apple Git-133)
In this case the solution is to install or reinstall git with homebrew.
$ brew install git
# <output>
# then restart your terminal
$ ls -l $(which git)
lrwxr-xr-x 1 user admin 28 Aug 16 12:11 /usr/local/bin/git -> ../Cellar/git/2.37.2/bin/git
$ git --version
git version 2.37.2
Don't forget to restart your terminal.
Upvotes: 0
Reputation: 88146
If you’re not getting prompted at all for a passphrase, the solution may just be to install a program to facilitate that. The most common is pinentry.
brew install pinentry-mac
So installing that and trying again may get things working. But if not, another thing to do is make sure git
it using/finding the right GPG program. These days you really should be using gpg2
, so if you don’t already have that installed, do this:
gpg --version
…and make sure it indicates you have GnuPG version 2+ (not version 1) installed.
If you already have GnuPG 2+ and pinentry
installed, then try this:
echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
…or, more robustly:
echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf
…and then try again.
And you may also need to stop gpg-agent
:
gpgconf --kill gpg-agent
You don’t need to manually restart it — it will get restarted automatically when it’s needed.
Note: Some commenters mention needing to reboot after making changes — but it seems likely the only effect of that is to cause gpg-agent
to be restarted. So manually killing gpg-agent
as described above should be sufficient.
Upvotes: 170
Reputation: 870
I ran brew upgrade
on macOS and it broke my gpg signing in git, presumably when it updated the gpg package. I assume there's an easier way to force the gpg service to restart correctly (I assume something that was actively running broke when I upgraded the package), but my fix for this was pretty simple: Just restart your computer.
Upvotes: 2
Reputation: 1531
In my case the user.signingkey was setting wrong....Copy the right signingkey the problem solved
Upvotes: 0
Reputation: 73
If you are still getting problems in macOS,
open ~/.gitconfig
and change anything below [gpg]
to
program = /usr/local/bin/gpg
Upvotes: 1
Reputation: 79
Install GPGSuite instead , it has GUI for generating the key.
You can see more details here
Upvotes: 0
Reputation: 447
I had the same error message and found that my key was expired. So it might be a good idea to check your key expiration with:
gpg --list-keys
If your key is expired as well you can adjust the expiration date with:
gpg --edit-key <YOUR_KEY>
and then:
gpg> expire
...enter the new expiration date...
gpg> save
Upvotes: 11