我一直在尝试使用 git
和 gpg
密钥进行工作,经过大量搜索和阅读文章后,唯一对我有效的方法是:
sudo rm /usr/local/bin/gpgsm
ln -s /usr/local/bin/gpg /usr/local/bin/gpgsm
这个技巧可以让
git
运行gpg
命令而不是gpgsm
命令,如下所示:GIT_TRACE=1 git commit -S -m"test"
21:24:25.489158 git.c:418 trace: built-in: git commit -S -mtest
21:24:25.493338 run-command.c:643 trace: run_command: gpgsm --status-fd=2 -bsau myKey
error: gpg failed to sign the data
fatal: failed to write commit object
我找不到任何关于为什么git
正在运行gpgsm
命令的额外信息,因为单独运行该命令会产生以下结果:
gpgsm --status-fd=2 -bsau myKey
gpgsm: can't sign using 'myKey': No public key
[GNUPG:] INV_SGNR 1 myKey
[GNUPG:] INV_RECP 1 myKey
据我阅读,gpg
和gpgsm
的数据库是分开的,这似乎是有道理的。
git
似乎也不想使用gpgsm
密钥,因为它们需要CN和DNS条目。如果我的猜测错误,我很高兴被指出来,因为我不想使用符号链接hack。
环境详情:
- 通过Homebrew安装的gpg,版本为
2.2.11
- 将
no-tty
添加到~/.gnupg/gpg.conf
对我来说实际上使情况更糟了。 - 更改后我已重新启动以确保gpg代理停止。
~/.gnupg/gpg-agent.conf
的内容为:pinentry-program /usr/local/bin/pinentry
gpg
二进制文件)还是CMS(gpgsm
二进制文件)?另外,你正在使用哪个Git版本? - bk2204gpg
二进制文件(而不是符号链接黑客),您会得到什么输出?此外,如果您运行touch /tmp/foo && gpg --status-fd=2 -bsa /tmp/foo
来签署一个空文件,您会得到什么输出? - bk2204gpg gpg: 警告:未提供命令。正在尝试猜测您的意图... gpg: 输入您的消息...
第二条指令:touch /tmp/foo && gpg --status-fd=2 -bsa /tmp/foo [GNUPG:] KEY_CONSIDERED FC660649664B0D5D12EE7B63B209F8077D754B33 0 [GNUPG:] KEY_CONSIDERED FC660649664B0D5D12EE7B63B209F8077D754B33 2 [GNUPG:] BEGIN_SIGNING H8 [GNUPG:] PINENTRY_LAUNCHED 2111 curses 1.1.0 /dev/ttys006 xterm- 256color - [GNUPG:] SIG_CREATED D 1 8 00 1545082985 FC660649664B0D5D12EE7B63B209F8077D754B33
- Richard Geniesse