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

我尝试过这样的东西:

alias commit = commit -S

但这并没有奏效。

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

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


当前回答

git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true

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

更新:每一个新的git法令,所有的配置键应该在骆驼的情况下。

其他回答

git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true

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

更新:每一个新的git法令,所有的配置键应该在骆驼的情况下。

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

% 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。

编辑:从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

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

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

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