如何根据谓词更改特定提交的作者
How to change author of specific commits based on a predicate
我看到的关于这个问题的所有答案 (here, here) 只提供了更改最近提交或所有提交的方法,但是我只想更改匹配的过去提交的作者某个谓词。我查看了 git filter-branch(已弃用)、git-filter-repo(其替代品)和 bfg,但不知道如何进行此更改。
我直觉上试图解决这个问题的方法是:
- 首先找到我要更改的所有提交。
- 更改这些提交的作者。
我在历史上有其他提交与我所做的同一作者不想更改,我只想更改与特定谓词匹配的提交。
因此对于第 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_NAME
和 GIT_COMMITTER_EMAIL
,就像在 this answer.
中一样
我看到的关于这个问题的所有答案 (here, here) 只提供了更改最近提交或所有提交的方法,但是我只想更改匹配的过去提交的作者某个谓词。我查看了 git filter-branch(已弃用)、git-filter-repo(其替代品)和 bfg,但不知道如何进行此更改。
我直觉上试图解决这个问题的方法是:
- 首先找到我要更改的所有提交。
- 更改这些提交的作者。
我在历史上有其他提交与我所做的同一作者不想更改,我只想更改与特定谓词匹配的提交。
因此对于第 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_NAME
和 GIT_COMMITTER_EMAIL
,就像在 this answer.