当前位置: 首页 > 知识库问答 >
问题:

是否有一种使用GPG密钥在Git中“自动签名”提交的方法?

岳均
2023-03-14

有没有一种简单的方法可以让Git总是在创建的每个提交或标记上签名?

我试过这样的方法:

alias commit = commit -S

但这并没有成功。

我不想安装不同的程序来实现这一点。它容易做到吗?

只是一个附带的问题,也许提交不应该被签名,只有标签,我从来没有创建过,因为我为一个项目提交了单个提交,比如Homebrew,等等。

共有3个答案

凤自珍
2023-03-14

编辑:从Git版本1.7.9开始,可以对Git提交进行签名(Git commit-S)。稍微更新答案以反映这一点。

题目是:

是否有一种使用GPG密钥在Git中“自动签名”提交的方法?

简短的回答:是的,但不要这样做。

解决问题中的输入错误:git commit-s不会对提交进行签名。相反,从mangit提交页面:

-s、 --signoff
在提交日志消息的末尾添加提交者通过行签署的内容。

这将提供类似于以下内容的日志输出:


± $ git log                                                                                 [0:43:31]
commit 155deeaef1896c63519320c7cbaf4691355143f5
Author: User Name 
Date:   Mon Apr 16 00:43:27 2012 +0200

    Added .gitignore

    Signed-off-by: User Name 

请注意“签字人:…”一点这是由git commit上的-s标志生成的。

引用发布公告电子邮件:

  • “git commit”学习“-S”向GPG签署提交;这可以通过“git日志”的“-show signature”选项来显示

所以,是的,你可以签署promise。然而,我个人敦促谨慎对待这一选择;自动签名提交几乎毫无意义,请参见以下内容:

只是一个附带的问题,也许提交不应该被签名,只有标签,当我提交单个提交时,我从不创建标签。

没错。未签署promise书;标签是。原因可以在Linus Torvalds的这封信中找到,信的最后一段写道:

签署每个提交是完全愚蠢的。这只是意味着你把它自动化了,你让签名的价值降低了。它也不会增加任何真正的价值,因为SHA1的git DAG链的工作方式,您只需要一个签名就可以使从该签名中可以访问的所有提交都被该签名有效覆盖。所以在每个提交上签名只是忽略了这一点。

我鼓励浏览链接的消息,这澄清了为什么自动签署提交不是一个好主意,这远远好于我所能做到的。

但是,如果您想自动对标记进行签名,可以通过将git标记-[s|u]包装在别名中来实现;如果要这样做,可能需要在~/中设置密钥id。gitconfig或特定于项目的git/config文件。关于这个过程的更多信息可以在git社区手册中看到。对标记进行签名比对每个提交进行签名要有用得多。

丌官嘉良
2023-03-14
git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true

用您的密钥ID替换9E08524833CB3038FDE385C54C0AFCCFED5CDE14。请记住:使用短ID从来都不是一个好主意。

更新:每一个新的git指令,所有配置键应该在camelCase中。

谢财
2023-03-14

注意:如果您不想一直添加-S,以确保您的提交已签名,那么有一个建议(分支“pu”,目前为2013年12月,因此不保证它会成为git版本)来添加配置,该配置将为您处理该选项
2014年5月更新:在Git 2.0中(在此补丁系列中重新发送后)

参见Nicolas Vigier(博科姆)的commit 2af2ef3:

如果你想GPG签署你的所有提交,你必须添加-S选项。
commit.gpgsign配置选项允许自动签署所有提交。

commit.gpgsign

一个布尔值,用于指定是否所有提交都应进行GPG签名
在执行诸如rebase之类的操作时使用此选项可能会导致签署大量提交。使用代理可以避免多次键入GPG密码短语。

该配置通常是根据回购协议设置的(您不需要签署您的私人实验性本地回购协议):

cd /path/to/repo/needing/gpg/signature
git config commit.gpgsign true

您可以将其与user结合使用。signingKey用作全局设置(用于您要签署提交的所有回购协议的唯一键)

git config --global user.signingkey F2C7AB29!
                                           ^^^

正如ubobi在评论中建议的那样(并在GPG硬件密钥和Git签名中解释,基于“如何指定用户标识”)

当使用gpg一个感叹号()可以附加到强制使用指定的主或副密钥,而不是尝试和计算使用哪个主或副密钥。

user.signingKey在git 1.5.0(2007年1月)中引入了提交d67778e:

不应该要求我在git存储库和gpg密钥中使用相同形式的名称。
此外,我的keyring中可能有多个密钥,并且可能希望使用一个与我在提交中使用的地址不匹配的密钥留言。

此修补程序添加了一个配置条目“user.signingKey”,如果存在,将传递给gpg的“-u”开关,允许覆盖标记签名密钥。

这是通过commit aba9119(git 1.5.3.2)强制执行的,以便捕获用户错误配置用户的情况。在其中签名密钥。git/config或者他们的钥匙圈上没有任何密钥。

注意事项:

  • 按照惯例,自2015年3月git 2.4.0以来,它是SigningKey,而不是Signingkey,即使git config键不区分大小写。只有当您执行git config--get-regexp时才会有关系,这是区分大小写的,否则,它只是一种可读性约定;
  • 如果您想让git服务器检查每个推送的签名,您将需要git 2.2(2014年10月)至少(提交b945901),因为git press-签名未能考虑<-plhd--0/>键配置值;
  • git 2.9(2016年6月)将使用user.signingKey强制签名带注释的标签以及提交:提交61c2fe0。

 类似资料:
  • 我在尝试使用Git提交时遇到此错误。 我已经生成了一个新的密钥,如下所示,但它仍然给出相同的错误 密钥与上述相同 我发现这会生成一个用于git标记的GPG密钥,并按照步骤进行操作,但仍然不起作用,知道吗?

  • 我想使用我的GPS(2)子键之一对Git中的提交/标记进行签名,即新创建的RSA4096仅签名键,长ID为B0###。。。 我正在处理一个钥匙环,将主钥匙移除(备份)作为“更好的钥匙策略” 所以,我尝试为Git设置签名密钥 然而,promise 其中一个gpg代理启动并运行。 我的第一个猜测是,Git不理解长键符号,而是尝试了短键符号 但这也失败了 所以,我想知道这里有什么中断,如果Git只使用主

  • 正在签署的摘要到底是什么?如果签名嵌入到提交对象中,那么它很难是提交哈希本身-那么它是树哈希吗?还是别的什么?这是否意味着提交消息没有签名并且可能被篡改? 注意:我在这里使用一个用--object-type sha256初始化的git存储库来使用基于SHA-256的哈希值(默认情况下git使用SHA-1),但我的问题也适用于带有SHA-1哈希值的git存储库(以防gpg签名对SHA-1和SHA-2

  • 我最近尝试了Linux的Windows子系统,当我试图用最近生成的GPG密钥签署git提交时,它吐了出来, 我已经使用git很长时间了,我知道我必须在git上设置本地或全局变量才能使用我的GPG密钥。 在第一个错误之后,我试图生成另一个键,但也不起作用,包括子键。 我的GPG在RSA和RSA(默认)中加密。 我尝试过使用有关帮助的文章。github。但是没有用。 (以下是一些具体来源。)https

  • 我在尝试签署提交时遇到以下错误: 这是gpg--list secret keys--keyid format LONG的输出 钥匙在那儿 这是使用相同密钥的git config 知道出什么问题了吗?

  • 这可能吗?如何从命令行执行此操作?