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

只是想问这里是否有一个简单的方法来确保Git始终签署它创build的每个提交或创build的标记?

我尝试了这样的东西:

 别名commit = commit -S 

但是这并没有诀窍。

我不想安装所有不同的大型程序来实现这一点。 只要它是可行的,不是一个可以维护的问题。

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

注意:如果您不想一直添加-S以确保您的提交已经签名,则有一个提案(2013年12月的分支“ pu ”,因此不保证它会使其成为git发行版)添加一个configuration,将照顾你的select。
更新2014年5月:它在Git 2.0(在重新发布这个补丁系列之后 )

见Nicolas Vigier(boklm)的 commit 2af2ef3 :

添加commit.gpgsign选项来签署所有提交

如果您想要GPG签名所有提交,则必须始终添加-S选项。
commit.gpgsignconfiguration选项允许自动签署所有提交。

 commit.gpgsign 

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


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

 cd /path/to/repo/needing/gpg/signature git config commit.gpgsign true 

你可以将它与用作全局设置的user.signingKey结合使用(唯一的密钥用于你想签署提交的所有回购)

 git config --global user.signingkey F2C7AB29 

user.signingKey是在git 1.5.0(2007年1月)中用提交d67778e引入的 :

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

这个补丁添加了一个configuration项“ user.signingKey ”,如果有的话,它将被传递给gpg的“-u”开关,从而允许标签签名密钥被覆盖。

如果用户在其.git/configconfiguration了user.signingKey ,或者在密钥环中没有任何密钥,就会使用commit aba9119 (git 1.5.3.2 )来强制执行此操作。

笔记:

  • 按照惯例, 从2015年3月份的git 2.4.0开始 ,它是signingKey ,而不是signingkey ,即使git config键不区分大小写。 这只有在你使用git config --get-regexp 区分大小写)时才有意义,否则它只是一个可读性约定。
  • 如果你希望git服务器检查每个推送的签名 ,至less需要git 2.2+(2014年10月)( 提交b945901 ),因为git push --signed没有考虑到user.signingKeyconfiguration值;
  • git 2.9(2016年6月)将使用user.signingKey强制签名注释标签以及提交: commit 61c2fe0 。
 git config --global user.signingkey ED5CDE14 git config --global commit.gpgsign true 

用您的密钥IDreplaceED5CDE14。

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

问题标题是:

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

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

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

-s,–signoff
在提交日志消息的末尾添加Sign-off-by行。

这给出了一个类似于以下的日志输出:

 ± $ 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”向GPG学习了“-S”签名提交; 这可以用“–show-signature”选项来显示“git log”。

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

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

这是正确的。 提交没有签名; 标签是。 这个原因可以在Linus Torvalds的这个信息中find,最后一段说:

签署每个提交是非常愚蠢的。 这只是意味着你自动化了,而且让你的签名价值更低。 它也没有增加任何真正的价值,因为SHA1的git DAG链的工作方式,你只需要一个签名,使所有可以从那个签名可达的提交有效地覆盖。 因此,签署每个提交只是没有意义。

我鼓励浏览链接的消息,这清楚地表明为什么签名提交自动不是一个好主意,以一种更好的方式比我能。

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

要使自动签名工作在git 2.0版之前,你必须添加git别名来提交。

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

你需要明确的是,如果你签署了一个提交或标签,那你并不意味着你批准了整个历史。 在提交的情况下,你只签署了变化,如果是标签,那么你需要定义你的意思。 你可能已经提出了一个改变,声称它是从你而不是(因为有人把它推到你的遥控器)。 或者这是你不想要的变化,但是你只是签了标签。

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

签名提交是一个问题,如果他们将重新挑选或樱桃采摘给其他父母。 但是,如果修改的提交可以指向实际validation的“原始”提交,那将会很好。