如何根据谓词更改特定提交的作者

How to change author of specific commits based on a predicate

我看到的关于这个问题的所有答案 (here, here) 只提供了更改最近提交或所有提交的方法,但是我只想更改匹配的过去提交的作者某个谓词。我查看了 git filter-branch(已弃用)、git-filter-repo(其替代品)和 bfg,但不知道如何进行此更改。

我直觉上试图解决这个问题的方法是:

  1. 首先找到我要更改的所有提交。
  2. 更改这些提交的作者。

我在历史上有其他提交与我所做的同一作者不想更改,我只想更改与特定谓词匹配的提交。

因此对于第 1 步,查找其提交消息具有特定子字符串的所有提交:

git log --pretty=format:'%H %s' | grep 'My Commit Message' | awk '{print }'

然后对于第 2 步,我希望能够执行如下操作:

step1command | xargs -I@ git commit --amend --author "New Name <name@email.com>" @

但好像没那么简单。我该怎么办?

谢谢!

感谢@phd 的帮助,我找到了可行的解决方案:

git filter-branch --env-filter '
if git show -s --format="%s" $GIT_COMMIT | grep "My commit message";
then
    export GIT_AUTHOR_NAME="New Name"
    export GIT_AUTHOR_EMAIL="new@email.com"
fi
' --tag-name-filter cat -- --branches --tags

然后 运行 git push -f 强制更改远程仓库中的现有提交。

注意,这只会更改作者姓名和电子邮件,不会更改提交者。为此,您还需要更改 GIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL,就像在 this answer.

中一样