git使用新的GPG密钥重新签名commit

  当你的GPG密钥发生了泄露或强迫症等其他情况,重新生成GPG密钥后,需要将原有的签名替换为新的签名,利用git filter-branch命令可以一键完成此操作,此操作建议仅在私人仓库使用。

  使用git rebase命令,可以重新回到某些时刻,此时执行git commit -S --amend可以达到重新签名的目的,但此操作相当于重新生成一个新的commit,而使用git filter-branch命令,虽然也改变了"commit id",但是可以视为与原来的commit相同。

  简单版本,为所有commit重新签名:

1
git filter-branch --commit-filter 'git commit-tree -S "$@";' -- --all

  进阶版本:重新签名指定commit之后的所有commit,将FIXME替换为指定commit id:

1
git filter-branch --commit-filter 'git commit-tree -S "$@";' FIXME..head

  终极版本:签名所有commit但排除某些指定commit,先将需要排除的commit id写入一个临时文件,这里以~/list为例:

1
2
3
4
5
6
git filter-branch --commit-filter '
if echo $GIT_COMMIT | grep -F -f ~/list >/dev/null; then
git commit-tree "$@";
else
git commit-tree -S "$@";
fi' -- --all