有没有一种简单的方法可以让 Git 总是对创建的每个提交或标签进行签名?
我尝试过类似的东西:
别名提交 = 提交 -S
但这并没有奏效。
我不想安装不同的程序来实现这一点。是否可以轻松实现?
只是一个附带问题,也许不应该签署提交,只有标签,我从未创建过,因为我为 Homebrew 等项目提交单个提交。
有没有一种简单的方法可以让 Git 总是对创建的每个提交或标签进行签名?
我尝试过类似的东西:
别名提交 = 提交 -S
但这并没有奏效。
我不想安装不同的程序来实现这一点。是否可以轻松实现?
只是一个附带问题,也许不应该签署提交,只有标签,我从未创建过,因为我为 Homebrew 等项目提交单个提交。
注意:如果您不想一直添加-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
或只是没有任何密钥的情况。
笔记:
signingKey
,不是signingkey
,即使git config
键不区分大小写。仅当您这样做时才重要git config --get-regexp
,这是区分大小写的,否则,它只是一个可读性约定;git push --signed
未考虑user.signingKey
配置值;user.signingKey
强制签署带注释的标签以及提交:commit 61c2fe0。git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true
将 9E08524833CB3038FDE385C54C0AFCCFED5CDE14 替换为您的密钥 ID。请记住:使用短 ID 绝不是一个好主意。
更新:根据新的 git edict,所有配置键都应该在 camelCase 中。
编辑:从 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。签署标签比签署您所做的每个提交都有用得多。
要使自动签名在 git 版本 2.0 之前工作,您必须为提交添加 git 别名。
# git config --global alias.commit commit -S
[alias]
commit = commit -S
首先设置您要用来签署所有提交、标签和推送的公钥。要获取公钥,请使用以下命令
% 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
您需要明确指出,如果您签署提交或标签,并不意味着您批准了整个历史记录。在提交的情况下,您只需对手头的更改进行签名,而在标签的情况下,嗯..您需要定义您的意思。您可能已经提取了一个声称它来自您但不是来自您的更改(因为其他人将其推送到您的遥控器)。或者这是您不想参与的更改,但您只是签署了标签。
在典型的 OSS 项目中,这可能不太常见,但在企业场景中,您只是不时地接触代码并且您没有阅读整个历史,它可能会被忽视。
如果他们将被重新定位或挑选给其他父母,那么签署提交是一个问题。但是,如果修改后的提交可以指向实际验证的“原始”提交,那就太好了。