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

时间:2012-04-15 10:26:04

标签: git public-key-encryption gnupg

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

我尝试了类似的东西:

alias commit = commit -S

但这并没有成功。

我不想安装其他程序来实现这一目标。是否可以轻松实现?

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

5 个答案:

答案 0 :(得分:236)

注意:如果您不想一直添加-S以确保您的提交已签名,则会有一个提案(目前为分支“pu”,2013年12月,所以没有保证它会使它成为一个git版本)添加一个配置,它将为你处理该选项 2014年5月更新:它位于Git 2.0中(在resend in this patch series之后)

commit 2af2ef3Nicolas Vigier (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相结合(用于您要签名提交的所有仓库的唯一键)

git config --global user.signingkey F2C7AB29

使用commit d67778e在git 1。5。0(2007年1月)中引入了

user.signingKey

  

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

     

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

这是使用commit aba9119(git 1.5.3.2)强制执行的,以便了解如果用户在user.signingKey中配置错误.git/config或者没有任何秘密的情况钥匙圈上的钥匙。

注意:

答案 1 :(得分:141)

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

用您的密钥ID替换9E08524833CB3038FDE385C54C0AFCCFED5CDE14。请记住:It's never a good idea to use the short ID

更新:a new git edict,所有配置密钥都应该在camelCase中。

答案 2 :(得分:48)

编辑:从Git 1.7.9开始,it is possible签署Git提交(git commit -S)。稍微更新答案以反映这一点。

问题标题是:

  

有没有办法用GG密钥在Git中“自动设置”提交?

简短回答:是的,但不要这样做。

解决问题中的拼写错误: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 

注意“Signed-off-by:...”位;由-s上的git-commit标志生成的。

引用release announcement email

  
      
  • “git commit”学会了“-S”到GPG签名提交;这可以显示出来   使用“git log”的“--show-signature”选项。
  •   

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

  

只是一个附带问题,也许提交不应该签名,只有标签,我从不创建,因为我提交单一提交。

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

  

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

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

,如果您想自动签署标记,您可以通过将git-tag -[s|u]包装在别名中来实现;如果您要这样做,您可能希望在~/.gitconfig或项目特定的.git/config文件中设置密钥ID。有关该流程的更多信息,请参阅git community book。签名标签比签署每个提交更有用。

答案 3 :(得分:5)

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

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

答案 4 :(得分:0)

您需要明确指出,如果您签署提交或标记,则表示您并不意味着您批准了整个历史记录。在提交的情况下,您只需签署手头的更改,如果是标记,那么......您需要定义它的含义。您可能已经撤消了声称它来自您的更改但是没有(因为其他人将其推送到您的遥控器)。或者这是一个你不想进入的变化,但你刚刚签署了标签。

在典型的OSS项目中,这可能不太常见,但在企业场景中,您只是偶尔触摸代码而您不会阅读整个历史记录,这可能会被忽视。

签署提交是一个问题,如果他们将得到重新安排或挑选给其他父母。但如果修改后的提交可以指向实际验证的“原始”提交,那将是件好事。