是否有一种简单的方法让Git总是为每次创建的提交或标记签名?

我尝试过这样的东西:

alias commit = commit -S

但这并没有奏效。

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

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


当前回答

为了让自动签名工作在git 2.0版本之前,你必须为提交添加git别名。

# git config --global alias.commit "commit -S"
[alias]
    commit = commit -S

其他回答

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

问题的题目是:

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

简单的回答是:是的,但不要这么做。

解决问题中的拼写错误:git commit -s不签署提交。相反,来自man git-commit页面:

- s,签收 在提交日志消息的末尾添加提交者的签到行。

这将给出类似如下的日志输出:


± $ 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 -签名提交;这可以显示 使用“——show-signature”选项来“git log”。

是的,你可以签名提交。然而,我个人强烈建议谨慎对待这一选择;自动签名几乎没有意义,如下所示:

只是一个题外话,也许提交不应该被签名,只有标签,我从来没有创建过,因为我提交单个提交。

这是正确的。提交不会被签名;标签。原因可以在Linus Torvalds的文章中找到,文章的最后一段说:

签署 每次提交都很愚蠢。它只意味着你把它自动化了,而你 降低签名的价值。它也不会增加任何实际价值,因为 SHA1的git dag链的工作方式,你只需要一个 签名,以使从该提交可到达的所有提交都有效 被这个覆盖了。所以每次提交签名都没有抓住重点。

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

然而,如果你想自动签名一个标签,你可以通过在一个别名中包装git-tag -[s|u]来做到这一点;如果要这样做,可能需要在~/中设置键id。Gitconfig或项目特定的.git/config文件。关于这个过程的更多信息可以在git社区手册中看到。签名标签比签名每次提交要有用得多。

为了让自动签名工作在git 2.0版本之前,你必须为提交添加git别名。

# git config --global alias.commit "commit -S"
[alias]
    commit = commit -S

注意:如果你不想一直添加-S来确保你的提交被签名,有一个建议(目前是2013年12月的'pu'分支,所以不能保证它会出现在git版本中)添加一个配置来为你处理这个选项。 2014年5月更新:在Git 2.0中(在此补丁系列中重新发送后)

参见Nicolas Vigier (boklm)的commit 2af2ef3:

添加提交。Gpgsign选项对所有提交进行签名

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

commit.gpgsign

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


该配置通常是在每次回购时设置的(你不需要签署你的私人实验性本地回购):

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时,可以添加感叹号(!)以强制使用指定的主键或辅助键,而不是尝试计算要使用哪个主键或辅助键。

请注意,Rik在评论中补充道:

If you're using something like a YubiKey (as recommended) you don't need to worry about the exclamation point because the only signing key(s) you should have available for a primary key-pair are: the primary key itself, which should have a # after it indicating it's not available, and the secret subkey with a > after it indicating it's a stub that points to the YubiKey as the only available signing key in its applet. Only if you keep all your private keys available on your system (bad practice), then probably it would be a good idea to prevent auto-selection between available signing keys


用户。signingKey是在git 1.5.0(2007年1月)的commit d67778e中引入的:

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

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

这是通过commit aba9119 (git 1.5.3.2)强制执行的,以便捕捉If用户错误配置user. xml的情况。在他们的.git/config中signingKey或者在他们的密匙环上没有任何密钥。

注:

By convention, since git 2.4.0 March 2015, it is signingKey, not signingkey, even though the git config keys are case insensitive. That would matter only if you do git config --get-regexp, which is case sensitive, otherwise, it is only a readability convention; If you want the git server to check the signature for each push, you will need git 2.2+ (Oct. 2014) at least (commit b945901), as git push --signed failed to consider the user.signingKey config value; git 2.9 (June 2016) will use user.signingKey to force signing annotated tags as well as commits: commit 61c2fe0.

您需要清楚地表明,如果您签署了一个提交或标记,并不意味着您批准了整个历史记录。在提交的情况下,您只签署手边的更改,而在标签的情况下,嗯..你需要明确你的意思。你可能拉了一个声称来自你的更改,但实际上不是(因为其他人把它推到了你的遥控器上)。或者这是一个你不想参与的变化,但你只是签了标签。

在典型的OSS项目中,这可能不太常见,但在企业场景中,你只是偶尔接触代码,而不阅读整个历史,它可能不会被注意到。

如果它们将被重基于或被挑选到其他父节点,那么签署提交就是一个问题。但是,如果修改后的提交可以指向实际验证的“原始”提交,那就更好了。

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

% 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

请注意,如果你使用推。gpgSign true,如果服务器不支持有符号的推送,则推送将失败。另一种选择是使用:

git config --global push.gpgSign "if-asked" 

上面写着,如果服务器支持,为所有推送签名。

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

有时您可能需要重写这些设置。

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

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

对于push,使用git push——no-signed或,——signed=false。