有没有办法在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.gpgsign
configuration选项允许自动签署所有提交。
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/config
configuration了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.signingKey
configuration值; - 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的“原始”提交,那将会很好。