我参考了几篇关于Git 2.10发行说明中的漂亮属性的文章。将git升级到2.10.0,并对全局的.gitconfig进行了更改,结果如下-
[filter "lfs"]
clean = git-lfs clean %f
smudge = git-lfs smudge %f
required = true
[user]
name = xyz
email = abc.def@gmail.com
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
但是现在我尝试使用
git commit -a -S -m "message"
我看到下面的错误-
你需要一个密码来解锁秘钥
用户:“XYZ(数字签名)”
2048-bit RSA key, ID AAAAAAAA, created 2016-07-01
错误:GPG数据签名失败致命:写提交失败
对象
注意-我仍然可以使用git commit -a -m "message"来提交更改
有办法克服同样的问题吗?或者在gpg配置中需要做任何改变以适应git的升级?
更新1
还寻求进一步的有用性,以下是是否有一种方法在Git中使用GPG密钥“自动签名”提交?我已经配置了密钥使用
git config --global user.signingkey ED5CDE14(with my key)
git config --global commit.gpgsign true
很明显得到了相同的错误。
2016年10月更新:第871期提到“Git 2.9.3中签名停止工作”
Git for Windows 2.10.1于两天前(2016年10月4日)发布,修复了提交和标记的交互式GPG签名。
git中最近的gpg-sign更改(在Linux上没有问题)暴露了一个问题,即在Windows上,非msys2 -git与MSYS2-gpg交互的方式。
最初的回答:
阅读“7.4 Git工具-签名你的工作”,我假设你有你的“用户”。Signingkey”配置集。
最后一次围绕gpg的大重构(在Git 2.10之前)是在提交2f47eae2a,在这里错误消息被移动到gpg-interface.c
该文件的日志显示了提交af2b21e (Git 2.10)中最近的更改
gpg2 already uses the long format by default, but most distributions seem to still have "gpg" be the older 1.x version due to compatibility reasons. And older versions of gpg only show the 32-bit short ID, which is quite insecure.
This doesn't actually matter for the verification itself: if the
verification passes, the pgp signature is good.
But if you don't
actually have the key yet, and want to fetch it, or you want to check
exactly which key was used for verification and want to check it, we
should specify the key with more precision.
因此,请检查您如何指定用户。签名密钥配置和正在使用的GPG版本(gpg1或gpg2),以查看它们是否对错误消息有任何影响。
还有提交0581b54,它改变了gpg未能签署数据错误消息的条件(作为提交0d2b664的补充):
我们目前根本不从stderr读取。然而,在未来的补丁中,我们会想要这样做,所以这也为我们做好了准备(在这种情况下,gpg确实会在读取所有输入之前写入,尽管同样,键uid不太可能填满管道缓冲区)。
提交4322353显示gpg现在使用临时文件,因此可能存在正确的问题。
让我们转换为使用tempfile对象,该对象处理
对我们来说困难的案子,再加上失踪的清理电话。
我在OSX上遇到了这个问题。
最初的回答:
这似乎是一个gpg更新(brew)改变了gpg的位置到gpg1,你可以改变二进制的git查找gpg:
git config --global gpg.program gpg1
如果没有gpg1: brew,请安装gpg1。
答:更新
看起来gpg1被弃用了/“慢慢地退出使用”,所以你可能真的应该更新到gpg2,不幸的是这涉及到相当多的步骤/一点时间:
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
在M1 mac等较新的系统上:
echo "pinentry-program /opt/homebrew/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf
killall gpg-agent
第一部分安装gpg2,后一部分是使用它所需的hack。关于故障排除,请参阅这个答案(虽然这是关于linux而不是brew),它建议一个很好的测试:
echo "test" | gpg --clearsign # on linux it's gpg2 but brew stays as gpg
如果此测试成功(没有包含PGP签名的错误/输出),则您已经成功更新到最新的gpg版本。
现在您应该可以再次使用git签名了!
值得注意的是,你需要:
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
注意:在你运行了一个有签名的提交之后,你可以验证它的签名:
git log --show-signature -1
其中将包括最后一次提交的GPG信息。
我在构建最新的Git源代码(2.12.2)时遇到了类似的问题,同时还构建了所有依赖项的最新源代码(Zlib、Bzip、cURL、PCRE、ReadLine、IDN2、iConv、Unistring等)。
结果libreadline给GnuPG带来了问题:
$ gpg --version
gpg: symbol lookup error: /usr/local/lib/libreadline.so.7: undefined symbol: UP
当然,尝试用-vvv从Git中获取有用的信息失败了,所以失败是一个谜。
要解决由于ReadLine导致的PGP失败,请遵循不能更新或使用包管理器—gpg错误的说明:
在终端:
ls /usr/local/lib
这里有很多readline lib (libreadline。so。blah - blah)
所以我:
苏
mkdir临时
Mv /usr/local/lib/libreadline* temp
ldconfig
我用这个简单的食谱来做:
在macOS上自动签名提交(全局和不同的ide):
用这种方法获取签名密钥。
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
将以下内容放入gpg.conf文件(使用nano ~/.gnupg/gpg.conf命令编辑文件):
no-tty
将以下内容放入gpg-agent.conf文件中(使用nano ~/.gnupg/gpg-agent.conf命令编辑文件):
pinentry-program /usr/local/bin/pinentry-mac
更新:
根据评论中的建议,您可能需要在编辑配置文件gpg.conf后执行killall gpg-agent命令。不用说,这个命令将终止GPG (Gnu Privacy Guard)代理。
上面的答案很好,但对我来说并不管用。解决我的问题的方法是同时导出公钥和密钥。
列出要导出的机器上的键
$ gpg --list-keys
/home/user/.gnupg/pubring.gpg
--------------------------------
pub 1024D/ABCDFE01 2008-04-13
uid firstname lastname (description) <email@example.com>
sub 2048g/DEFABC01 2008-04-13
导出密钥
$ gpg --output mygpgkey_pub.gpg --armor --export ABCDFE01
$ gpg --output mygpgkey_sec.gpg --armor --export-secret-key ABCDFE01
去机器,我们正在导入和导入
$ gpg --import ~/mygpgkey_pub.gpg
$ gpg --allow-secret-key-import --import ~/mygpgkey_sec.gpg
宾果邦戈,你完蛋了!
参考:https://www.debuntu.org/how-to-importexport-gpg-key-pair/
ps.我的钥匙最初是在bootcamp windows 7上制作的,我把它们导出到我的mac air上(相同的物理机器,虚拟不同)
我的观点是:
当您创建并向gpg-agent添加密钥时,您定义了称为passphrase的东西。现在这个密码短语在某个时候到期了,gpg需要您再次输入它来解锁密钥,以便您可以再次开始签名。
当您使用任何其他与gpg接口的程序时,gpg提示您输入您的密码短语不会出现(基本上gpg-agent在守护时不可能在stdin中显示输入对话框)。
其中一个解决方案是gpg——sign a_file.txt,然后输入您在创建密钥时输入的密码,然后一切都应该正常(gpg-agent应该自动签名)
关于如何为密码短语设置更长的超时,以便您不必一直这样做,请参阅此答案。
或者您可以使用ssh-keygen -p完全删除密码短语
编辑:做一个man gpg-agent来阅读一些关于如何自动发生上述情况的内容,并添加以下行:
GPG_TTY=$(tty)
export GPG_TTY
如果你正在使用bash(这是正确的答案,但我也保持我的思路),然后来源你的.bashrc文件或重新登录。
对于在MacOS机器上遇到此问题的任何人,请尝试以下方法:
brew uninstall gpg
brew install gpg2
brew install pinentry-mac (if needed)
gpg --full-generate-key Create a key by using an algorithm.
Get generated key by executing: gpg --list-keys
Set the key here git config --global user.signingkey <Key from your list>
git config --global gpg.program /usr/local/bin/gpg
git config --global commit.gpgsign true
If you want to export your Key to GitHub then: gpg --armor --export <key>
and add this key to GitHub at GPG keys: https://github.com/settings/keys (with START and END line included)
如果问题仍然存在:
Test -r ~/。bash_profile && echo 'export GPG_TTY=$(tty)' >> ~/.bash_profile
echo 'export GPG_TTY=$(tty)' >> ~/.profile
如果问题仍然存在:
安装https://gpgtools.org并通过从菜单栏按下sign来签署您使用的密钥:key -> sign
如果问题仍然存在:
转到:你的全局。gitconfig文件,在我的例子中是:/Users/gent/.gitconfig
并修改.gitconfig文件(请确保Email和Name与您在生成Key时创建的相同):
(用户)
邮箱= gent@youremail.com
name = Gent
signingkey = <YOURKEY>
(gpg)
程序= /usr/local/bin/gpg
(提交)
Gpsign = true
Gpgsign = true
(过滤“lfs”)
Process = git-lfs filter-process
Required = true
清洁= git-lfs清洁——%f
涂抹= git-lfs涂抹——%f
(证书)
Helper = osxkeychain
按照下面的url设置签名提交
https://help.github.com/en/articles/telling-git-about-your-signing-key
如果还在
GPG签署数据失败致命:
日志含义写提交对象失败
这不是git的问题,而是GPG的问题
遵循以下步骤
gpg——版本
回显"test" | GPG—clearsign
如果显示:
gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
然后使用export GPG_TTY=$(tty)
然后再次尝试echo“test”| GPG—clearsign
得到PGP签名。
Git config -l | grep GPG
gpg.program=gpg
commit.gpgsign=true
应用git commit -m "commitMsz"
我在Ubuntu 18.04上得到这个错误,原来我的密钥过期了。
为了看到这个,我运行了这个,它确认我的密钥过期了:
gpg --list-keys
为了纠正这个错误,我运行(使用之前命令中显示的ID):
gpg --edit-key <ID>
从那里,我延长了键0和键1的过期时间,遵循这些指令,最后输入键0,然后过期,并按照提示进行操作。然后重复键1。
之后,为了测试这一点,我运行:
echo test | gpg --clearsign
在修复之前,它失败了,错误如下:
gpg: no default secret key:无默认密钥
gpg: [stdin]: clear-sign failed: No secret key
但是在修复之后,相同的命令成功地对消息进行了签名,所以我知道事情又开始工作了!
我在Ubuntu上突然开始出现这种情况,不确定是不是最近的一些更新做到了,但没有一个现有的问题适用于我(我设置了GPG_TTY,尝试杀死代理等)。独立的gpg命令失败,错误如下:
$ echo "test" | gpg --clearsign
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
test
gpg: signing failed: Operation cancelled
gpg: [stdin]: clear-sign failed: Operation cancelled
我试着用——debug-all选项运行gpg,注意到下面的输出:
gpg: DBG: chan_3 <- INQUIRE PINENTRY_LAUNCHED 27472 gnome3 1.1.0 /dev/pts/6 screen-256color -
gpg: DBG: chan_3 -> END
gpg: DBG: chan_3 <- ERR 83886179 Operation cancelled <Pinentry>
gpg: signing failed: Operation cancelled
以上说明pinentry程序存在一些问题。Gpg通常会为我运行pinentry-curses,所以我把它改成了pinentry-tty(我必须先安装它),错误就消失了(尽管我不再得到全屏密码输入,但我不喜欢这样)。为了做出这个改变,我必须在~/.gnupg/gpg-agent.conf中添加一行pinentry-program /usr/bin/pinentry-tty,并使用gpgconf——kill gpg-agent来杀死代理(它会在下次重新启动)。
经过大量搜索,我发现gpg密钥是我的情况下的问题。
要检查gpg键是否为您的问题,首先检查以下输出:
GIT_TRACE=1 git commit -m 'message'
如果出现问题,你会看到如下内容:
10:37:22.346480 run-command.c:637 trace: run_command: gpg --status-fd=2 -bsau <your GPG key>
它显示我的名字和电子邮件在GPG密钥这里,但这应该有密钥。您可以尝试运行gpg——status-fd=2 -bsau <您的gpg密钥>
要更新正确的密钥,请执行以下操作:
检查密钥使用:GPG——list-secret-keys——keyid-format=long
它应该有以下输出:
/Users/hubot/.gnupg/secring.gpg
------------------------------------
sec 4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
uid Hubot
ssb 4096R/42B317FD4BA89E7A 2016-03-10
然后更新密钥使用:
git config --global user.signingkey 3AA5C34371567BD2
现在再次检查提交,如果关键字是问题,它应该成功。您需要设置密码短语来更新密钥,您可以使用GitHub文档进行更新。
更多详情见:https://gist.github.com/paolocarrasco/18ca8fe6e63490ae1be23e84a7039374
我发现检查git commit在底层做什么非常有用。使用GIT_TRACE=1运行以下提交:
GIT_TRACE=1 git commit -S -m "MESSAGE"
这将显示git在提交时使用的用户名、电子邮件和签名密钥。
在我的例子中,我发现git为签名提交选择了错误的用户和关键细节。我主要打算使用repo的本地配置,而不是全局配置,并将以下内容添加到本地git配置(位于“REPO_PATH/.git/config”),让提交在终端和VSCode中都可以工作
[user]
name = USER NAME
email = USER EMAIL
signingKey = SIGNING KEY
也可以设置如下:
git config --local user.name "USER NAME"
git config --local user.email "USER EMAIL"
git config --local user.signingkey "USIGNING KEY"
我的解决方案是:
首先,我试图了解为什么这是行不通的细节。在终端上按cmd命令尝试
$ echo "Hello" > test.txt
$ gpg --sign --default-key <your-email-id> test.txt
观察到详细信息错误:gpg: signing failed: No pinentry
gpg-agent[59045]: can't connect to the PIN entry module '/usr/local/bin/pinentry': IPC connect call failed .日志含义
gpg-agent[59045]: failed to unprotect the secret key: No pinentry .日志含义
从终端我点击下面的cmd:
cat ~/.gnupg/gpg-agent.conf
检查以下陈述是否存在。如果gpg-agent.conf中没有,需要添加
pinentry-program
/usr/local/MacGPG2/libexec/pinentry-mac.app /内容/ MacOS / pinentry-mac
添加pinentry路径后,运行
$ gpgconf --kill gpg-agent
$ gpg --sign --default-key <your-email-id> test.txt
查看输出:
gpg: using <your-email-id> as default secret key for signing