如何以加密方式对分支上的所有提交进行签名?

时间:2016-04-09 04:45:21

标签: git pgp git-filter-branch

我有PGP密钥,让我通过git commit -S签署提交。为了签署我的上次提交,我做了git commit -S --amend --no-edit并签署了我的提交。

现在,我想签署分支filtered中的所有提交。

我试过了:git filter-branch --commit-filter 'git commit -S --amend --no-edit'

它给了我一条错误信息:

$ git filter-branch --commit-filter 'git commit --amend --no-edit -S' HEAD
Rewrite 07b0ac12f5fe1d8963d7ae0ac7fbda50cb6e74a9 (1/10)gpg: skipped "Anubhav Saini <IAmAnubhavSaini@users.noreply.github.com>": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
fatal: failed to write commit object
could not write rewritten commit

另一个问题:提出另一个git commit --amend --no-edit -S会导致:

(filter-test)$ git commit -S --no-edit --amend

You need a passphrase to unlock the secret key for
user: "Anubhav Saini <iamanubhavsaini@gmail.com>"

[filter-test c5ea180] Removing defer and async from scripts
 4 files changed, 28 insertions(+), 28 deletions(-)

问题

  1. 如何批量签名提交消息?
  2. 在实际场景和幕后制作的另一个标志是什么?

2 个答案:

答案 0 :(得分:2)

考虑重写历史以签署分支中的所有提交可能会有点过分。

由于git对象模型,上下文中存在提交。单独签署头部提交也会对您的直接父母(或父母,如果它是合并提交)以及他们的父母一直反馈到您的存储库的第一天。

这就是为什么签署正式版本的标签就足够了。 Git对象是不可变的,因为每个对象的SHA-1对象名称都是从其内容派生的。因此,从已知的受信任点开始,您和其他人可以追逐指针(这是git loggit checkoutgit fsck等在幕后做的事情)来验证完整性。< / p>

如果您正在处理未发布的历史记录,请考虑使用git merge --squashgit rebase -i压缩历史记录并签署生成的提交。

答案 1 :(得分:0)

可能你应该为密码短语有效性设置一个gpg-agent,并且足以运行整个重写序列。请参阅此Arch wiki page以获取帮助。因此,可以在重写之前输入一次密码,然后gpg的所有调用都会使用该解锁密钥一段时间。