有没有办法用GG密钥在Git中"自动签名"提交?

Min*_*oth 197 git gnupg public-key-encryption

是否有一种简单的方法可以让Git始终标记每个创建的提交或标记?

我尝试过类似的东西:

alias commit = commit -S

但那并没有成功.

我不想安装其他程序来实现这一目标.它可以轻松实现吗?

只是一个侧面的问题,也许不应该提交提交,只有标签,我从不创建,因为我为Homebrew等项目提交单一提交.

Von*_*onC 249

注意:如果您不想一直添加-S以确保您的提交已签名,那么就会有一个提案(目前为分支" pu,2013年12月,因此无法保证它会进入git版本)以添加配置将为您处理该选项.
2014年5月更新:它在Git 2.0中(在此补丁系列中重新发送之后)

提交2af2ef3尼古拉斯·Vigier(boklm) :

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

如果您想要GPG签署所有提交,您必须-S始终添加该选项.
commit.gpgsign配置选项允许签署所有自动提交.

commit.gpgsign
Run Code Online (Sandbox Code Playgroud)

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


该配置通常按每个仓库设置(您不需要签署您的私人实验本地回购):

cd /path/to/repo/needing/gpg/signature
git config commit.gpgsign true
Run Code Online (Sandbox Code Playgroud)

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

git config --global user.signingkey F2C7AB29
Run Code Online (Sandbox Code Playgroud)

user.signingKey在git 1.5.0(2007年1月)中使用commit d67778e引入:

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

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

这与强制执行承诺aba9119为了赶在那里如果用户错误配置的情况下(GIT 1.5.3.2)user.signingKey在他们的.git/config或根本就没有自己的钥匙圈任何密钥.

笔记:

  • 您不需要签署私人实验回购...但为什么不呢? (12认同)
  • 不要忘记密钥 id 之后的“!”。就像`git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14!` (2认同)

Fel*_*ipe 154

git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true
Run Code Online (Sandbox Code Playgroud)

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

更新:根据新的git edict,所有配置密钥都应该在camelCase中.

  • 不会.正如您在版本历史中所看到的,有人在他的回答中添加了我的示例.ED5CDE14是我自己的个人密钥.但没问题. (17认同)
  • 离奇.我会在明天恢复变化,因为它对你来说很糟糕 (6认同)
  • @MarcusJ `gpg --list-keys --fingerprint` 将向您显示密钥的长形式(我想您必须手动删除空格)。 (3认同)

sim*_*ont 48

编辑:作为Git版本1.7.9,可能签署的Git提交(git commit -S).稍微更新答案以反映这一点.

问题标题是:

有没有办法用GG密钥在Git中"自动签名"提交?

简答:是的,但不要这样做.

解决问题中的拼写错误: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 
Run Code Online (Sandbox Code Playgroud)

注意"Signed-off-by:..."位; 那是由-s国旗上的旗帜产生的git-commit.

引用发布公告电子邮件:

  • "git commit"学会了"-S"到GPG签署提交; 这可以通过"git log"的"--show-signature"选项显示.

所以是的,你可以签署提交.但是,我个人敦促谨慎使用这个选项; 自动签名提交旁边没有意义,见下文:

只是一个侧面的问题,也许提交不应该签名,只有标签,我从来没有创建,因为我提交单一提交.

那是对的.提交没有签署; 标签是.其原因可以在Linus Torvalds的这条消息中找到,其中最后一段说:

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

我鼓励浏览链接的消息,这清楚地说明了为什么签名提交自动不是一个好主意,而且方式要好得多.

但是,如果要自动签署标记,则可以通过将git-tag -[s|u]别名包装在一个别名中来实现; 如果你要这样做,你可能想要设置你的密钥ID ~/.gitconfig或项目特定的.git/config文件.有关该过程的更多信息可以在git社区书中看到.签名标签比签署每个提交更有用.

  • "签署每个提交都是完全愚蠢的." - >当有一个"老鼠"开发人员喜欢用伪造的作者和提交者推送提交时,有什么更好的方法来保护提交?除非在服务器上有一些钩子魔法,否则他可以将"git blame"指向他想要的任何人. (70认同)
  • 我觉得Linus有点忽略了这一点.对于签名提交,他似乎有一个完全不同的用例,而不是该线程中的OP.(验证整个项目的完整性,验证单个提交的作者身份.) (17认同)
  • 0. [一篇文章](http://mikegerwitz.com/docs/git-horror-story.html),1."足以签署所有这些" - >如何判断"我声称_this_真的是_my_ diff(但不确定任何先前和进一步的提交).我想在_my_ commit上放置一个签名,而不断言我从中央服务器/其他任何东西提取的提交.2.在不受信任的环境中,仍然应该有一个可靠的工具来查找谁是有罪的.如果服务器检查所有提交是否使用提交者的电子邮件密钥签名,则很难伪造提交(如果您保护好计算机). (9认同)
  • 如果代码永远不会更改,则签署一个提交就足够了 添加更多提交后,您将需要更多签名.对标记进行签名会将所有内容标记为OLDER而不是该提交.如果在提交即将到来时需要细粒度验证,则签署每个提交都是有意义的.否则你必须使用很多标签,这会使回购混乱.在经过身份验证的远程git repos上,每次推送提交时都必须提供密码或ssh密钥,而不仅仅是在推送标记时.这是类似的情况. (7认同)
  • 这个答案仍然是过时的和自相矛盾的 - 例如,最后声称"提交没有签名;标签是"的位. (6认同)
  • -1表示"是的,但不要这样做".答案应该是"是".签名提交证明了作者,否则可以在提交中撒谎. (6认同)
  • “是的,但不要这样做”——为什么?没有理由这样做。将其自动化是非常有意义的。这类似于默认情况下签署您的电子邮件。您应该确保您的密码立即被忘记或在一段合理的短暂超时后被忘记,否则您会很好。 (4认同)
  • 现在,在git中可以使用`commit.gpgsign`选项(以便始终对每个提交进行签名),这是否意味着该参数已丢失?如果它"完全愚蠢",为什么会提供? (4认同)
  • 正如莱纳斯的典型:大声,大量的意见,其中很多都是错的,但是那些跟随他的开发者不敢质疑他的话.真的很遗憾. (4认同)

blu*_*ray 16

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

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

在这种情况下,公钥是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
Run Code Online (Sandbox Code Playgroud)

请注意,如果使用push.gpgSign true,如果服务器不支持签名推送,推送将会失败。另一种方法是使用:

git config --global push.gpgSign "if-asked" 
Run Code Online (Sandbox Code Playgroud)

也就是说,如果服务器支持,则对所有推送进行签名。

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

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

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

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

对于推送,请使用git push --no-signed或, --signed=false

  • 签名推送是一个很好的补充。这个功能很容易被遗忘。我应该补充一点,它也可以设置为“如果询问”。这种方式只有在服务器支持时才会对推送进行签名。 (2认同)

Shu*_*ary 6

要在git 2.0版之前进行自动签名工作,您必须为commit添加git别名.

# git config --global alias.commit commit -S
[alias]
    commit = commit -S
Run Code Online (Sandbox Code Playgroud)