【问题标题】:How to change author of specific commits based on a predicate如何根据谓词更改特定提交的作者
【发布时间】:2021-11-02 15:19:39
【问题描述】:

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

我直观地尝试解决此问题的方式是:

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

我在历史上与同一作者有其他提交,我确实不想想要更改,我只想更改与某个谓词匹配的提交。

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

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

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

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

但这似乎没有那么简单。我该怎么办?

谢谢!

【问题讨论】:

标签: git git-filter-branch


【解决方案1】:

感谢@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

【讨论】:

  • 这是正确的答案。 :-) 由于 filter-branch 从字面上运行你的 shell 片段(在这种情况下使用 eval),它使得做任意花哨的东西变得容易(ish)。太糟糕了 filter-branch 本身是如此笨拙并且被官方弃用,因为它确实很强大。
猜你喜欢
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 2017-10-27
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
相关资源
最近更新 更多