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

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

我尝试过这样的东西:

alias commit = commit -S

But that didn't do the trick.

I don't want to install a different program to make this happen. Is it doable with ease?

Just a side question, maybe commits shouldn't be signed, only tags, which I never create, as I submit single commits for a project like Homebrew, etc.

119520 次浏览

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

问题的题目是:

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

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

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

< p > - s, < br >签收

. log

. log

. log

. log

. log

. log

. log

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


± $ 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" learned "-S" to GPG-sign commit;这可以显示
  • .使用"——show-signature"选项到"git log"

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

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

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

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

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

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

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

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

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

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

参见提交2 af2ef3 by 尼古拉斯·维吉尔(boklm):

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

如果你想GPG签署你所有的提交,你必须一直添加-S选项。
commit.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的评论中所暗示的那样(并在“__abc2”中解释,基于“;__abc3”)

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

注意,里克的评论中添加了:

如果您正在使用类似YubiKey(推荐使用)的东西,则不需要担心感叹号,因为您应该为主密钥对提供的唯一签名密钥是:

  • 主键本身,它后面应该有一个#,表示它不可用,
  • 秘密子密钥后面带有>,表示它是指向YubiKey作为其applet中唯一可用签名密钥的存根。

只有当您在系统上保持所有私有密钥可用时(不好的做法),那么防止在可用的签名密钥之间进行自动选择可能是一个好主意


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

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

这个补丁增加了一个配置条目&;__abc0 &;如果出现,将被传递给"-u"切换为gpg,允许覆盖标记签名密钥。

这是由提交aba9119 (git 1.5.3.2)强制执行的,以捕捉这样的情况:如果用户在他们的.git/config中错误配置了user.signingKey,或者在他们的keyring上没有任何秘密密钥。

注:

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

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

更新:对于一项新的git法令,所有的配置键都应该是驼峰形的。

为了让自动签名工作在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

请注意,如果你使用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