278

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

我尝试过类似的东西:

别名提交 = 提交 -S

但这并没有奏效。

我不想安装不同的程序来实现这一点。是否可以轻松实现?

只是一个附带问题,也许不应该签署提交,只有标签,我从未创建过,因为我为 Homebrew 等项目提交单个提交。

4

6 回答 6

345

注意:如果您不想一直添加-S以确保您的提交已签名,则有一个提案(分支 ' pu' 现在,2013 年 12 月,因此不能保证它会进入 git 版本)添加一个config 它将为您处理该选项。
2014 年 5 月更新:它在 Git 2.0 中(在此补丁系列中重新发送后)

请参阅Nicolas Vigier (boklm)提交 2af2ef3

添加对commit.gpgsign所有提交进行签名的选项

如果您想对所有提交进行 GPG 签名,则必须-S始终添加该选项。config 选项允许自动签署所有提交
commit.gpgsign

commit.gpgsign

一个布尔值,用于指定是否所有提交都应该是 GPG 签名的。
在执行 rebase 等操作时使用此选项可能会导致大量提交被签名。使用代理来避免多次输入您的 GPG 密码可能会很方便。


该配置通常是按 repo 设置的(您不需要签署您的私有实验性本地 repos):

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

您可以将其与user.signingKey用作全局设置相结合(用于您要签署提交的所有 repo 的唯一密钥)

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

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

使用 gpg 时,可能会附加感叹号 ( !) 以强制使用指定的主键或辅助键,而不是尝试计算要使用的主键或辅助键。


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

不应该要求我在我的 git 存储库和我的 gpg 密钥中使用相同形式的我的名字。
此外,我的密钥环中可能有多个密钥,并且可能想要使用与我在提交消息中使用的地址不匹配的一个。

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

这是通过提交 aba9119 (git 1.5.3.2) 强制执行的,以捕捉如果用户user.signingKey在他们的密钥环上配置错误.git/config或只是没有任何密钥的情况。

笔记:

于 2013-12-17T07:40:05.073 回答
243
git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true

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

更新:根据新的 git edict,所有配置键都应该在 camelCase 中。

于 2015-05-26T20:01:06.500 回答
49

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

问题标题是:

有没有办法在 Git 中使用 GPG 密钥“自动签名”提交?

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

解决问题中的错字:git commit -s不签署提交。相反,从man git-commit页面:

-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 

注意“Signed-off-by: ...”位;这是由-s.git-commit

引用发布公告电子邮件

  • “git commit”学习了“-S”来对提交进行 GPG 签名;这可以通过“git log”的“--show-signature”选项来显示。

所以是的,你可以签署提交。但是,我个人强烈建议谨慎使用此选项;自动签署提交几乎没有意义,见下文:

只是一个附带问题,也许不应该签署提交,只有标签,我从不创建,因为我提交单个提交。

这是正确的。提交未签名;标签是。原因可以在Linus Torvalds的这条消息中找到,该消息的最后一段说:

签署每个提交是完全愚蠢的。这只是意味着您将其自动化,并使签名的价值降低。它也没有增加任何真正的价值,因为 SHA1 的 git DAG 链的工作方式,你只需要一个 签名来使从那个可以到达的所有提交都被那个有效地覆盖。所以签署每个提交只是错过了重点。

我鼓励浏览链接的消息,它以比我更好的方式阐明了为什么自动签署提交不是一个好主意。

但是,如果您想自动签署一个标签,您可以通过将 包装git-tag -[s|u]在别名中来做到这一点;如果您要这样做,您可能希望在~/.gitconfig特定于项目的.git/config文件中设置您的密钥 ID。有关该过程的更多信息,请参阅git community book。签署标签比签署您所做的每个提交都有用得多。

于 2012-04-15T22:59:29.300 回答
13

要使自动签名在 git 版本 2.0 之前工作,您必须为提交添加 git 别名。

# git config --global alias.commit commit -S
[alias]
    commit = commit -S
于 2016-10-19T11:01:04.083 回答
3

首先设置您要用来签署所有提交、标签和推送的公钥。要获取公钥,请使用以下命令

% gpg --list-keys --keyid-format=short
/home/blueray/.gnupg/pubring.kbx
-------------------------------
pub   rsa3072/F6EED39A 2021-12-25 [SC] [expires: 2023-12-25]

在这种情况下,公钥是F6EED39A。现在运行以下命令。

git config --global user.signingkey F6EED39A
git config --global commit.gpgSign true // sign all commits
git config --global tag.gpgSign true // sign all tags
git config --global push.gpgSign true // sign all push

现在您的所有提交、标签和推送都将由您给定的公钥自动签名。

有时您可能需要覆盖这些设置

对于提交,使用git commit --no-gpg-sign -m "Unsigned commit"

对于标签,使用git tag --no-sign <tag-name>

对于推送,使用git push --no-signed

于 2021-12-26T07:25:36.703 回答
0

您需要明确指出,如果您签署提交或标签,并不意味着您批准了整个历史记录。在提交的情况下,您只需对手头的更改进行签名,而在标签的情况下,嗯..您需要定义您的意思。您可能已经提取了一个声称它来自您但不是来自您的更改(因为其他人将其推送到您的遥控器)。或者这是您不想参与的更改,但您只是签署了标签。

在典型的 OSS 项目中,这可能不太常见,但在企业场景中,您只是不时地接触代码并且您没有阅读整个历史,它可能会被忽视。

如果他们将被重新定位或挑选给其他父母,那么签署提交是一个问题。但是,如果修改后的提交可以指向实际验证的“原始”提交,那就太好了。

于 2013-04-19T01:17:41.273 回答