当我想通过交互式的 rebase
来压缩一些提交时:
git rebase -i HEAD~3
然后:
pick cbd03e3 Final commit (signed)
s f522f5d bla-bla-bla (signed)
s 09a7b7c bla-bla (signed)
# Rebase c2e142e..09a7b7c onto c2e142e
...
尽管所有这些提交具有相同的签名,但最终提交未进行gpg签名。在交互式变基压缩之后,是否可能保留提交的gpg签名?
当我想通过交互式的 rebase
来压缩一些提交时:
git rebase -i HEAD~3
然后:
pick cbd03e3 Final commit (signed)
s f522f5d bla-bla-bla (signed)
s 09a7b7c bla-bla (signed)
# Rebase c2e142e..09a7b7c onto c2e142e
...
尽管所有这些提交具有相同的签名,但最终提交未进行gpg签名。在交互式变基压缩之后,是否可能保留提交的gpg签名?
像 Cupcake 所说的那样,您无法从未压缩的提交中保留旧签名,但如果您像这样变基,则可以为新的压缩提交进行签名:
git rebase --interactive --gpg-sign=myemail@example.com HEAD~4
将 --gpg-sign=myemail@example.com
添加为参数将对最终压缩提交进行签名。
error: unknown option 'gpg-sign=me@example.com'
。 - J.W.F.git rebase -i HEAD~4
命令,并使用 git commit --amend -S
命令编辑每个提交。 - Gabo Esquivelcommit.gpgsign
和user.signingkey
自动为我签署提交 - 这个设置不适用于变基吗? - Krishnan Shankargit commit
命令,然后你可以添加-S
选项,例如...或者使用其他选项。 - 0xC0000022L你能保留签名并修改历史记录是没有意义的。gpg签名的整个目的就是为了验证代码是否被篡改。如果你在修改历史记录后仍然能保留签名,那么这将完全失去其意义。
我目前没有使用gpg对我的Git代码进行签名,所以我不知道确切的细节,但我猜它可能会对树的最终提交对象进行哈希。当你像你的例子中那样进行变基时,最终提交
将具有不同的sha1 ID,因此它不是之前变基之前的相同对象,因此拥有相同的gpg签名可能是不可能的,而且正如我所说,这是没有意义的。
git checkout work-02
。我进行了 rebase,解决了合并冲突,并根据需要压缩了提交。work-01 没有任何变化。提交仍然保持原样。其中一些提交可能也存在于 work-02 中,有些可能几乎相同,但如果单个字符发生了变化,则具有新的提交哈希 ID。这个练习帮助我理解了 Git rebase。 - emory一种选择是将commit.gpgSign
设置为true
。这会始终签署提交,包括重定位的提交。
在本地仓库中执行:
git config commit.gpgSign true
全局操作:
git config --global commit.gpgSign true
git pull --rebase
不会检查签名(因为rebase部分会丢失它们)。gitster
--合并于提交73bc4b4,2016年6月20日)
pull
: 在--rebase
时使用--verify-signatures
进行警告
git-pull
在运行--rebase
时默默地忽略了--verify-signatures
选项,这可能会让用户误以为rebase操作会检查有效的GPG签名。虽然曾经讨论过为
git rebase
实现--verify-signatures
,但对于有效的工作流程存在疑虑。由于你通常将其他人的分支合并到你的分支中,因此你可能有兴趣确保他们的一侧具有有效的GPG签名。然而,rebase是在其他人的工作基础上重建你的分支,以便将结果推回,即使你发现他们的提交缺少可接受的签名,也已经太晚了,无法拒绝他们的工作。
让我们警告用户,在"
pull --rebase
"期间忽略--verify-signatures
选项;这样用户就不会想知道如果他们的提交缺少可接受的签名会发生什么。
edit
命令,并手动进行修订/提交(带有-S
选项),但是以预定的命令和自动化方式执行。git rebase --exec 'git commit --amend --no-edit -S' HEAD~3
使用--exec
选项时,-i
(--interactive
)是隐含的,根据文档,因此在上面没有给出。
在这里,我们按照问题中所示对HEAD~3
进行变基,并对每个提交使用git commit --amend --no-edit -S
。这通常只会要求一次输入PGP密钥的密码,然后快速处理剩下的提交。
NB:不用说,但由于有评论提到:与其他方法一样,你只能对自己的提交这样操作。去除--no-edit
,你将进入编辑器,显示(在底部的注释中)你要处理的更改内容。这样你可以验证提交是否属于你(除非你已经通过git log
或其他方式做过验证)。
可以说,在全局配置未设置时,要告诉Git进行签名,你也可以使用git -c commit.gpgSign=true
(或其他相关配置选项),通过--exec
传递的命令。