删除特定作者的所有提交记录

10

如何删除某个作者的所有提交记录(由于错误提交,此类作者不应在提交历史记录中可见)。

我已经找到了一些重命名代码 -

git filter-branch --env-filter '
OLD_EMAIL="old@gmail.com"
CORRECT_NAME="name"
CORRECT_EMAIL="new@gmail.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags


git push --force --tags origin 'refs/heads/*'

有没有一种过滤器可以删除这样的提交,而不是重命名它们?


你说的“删除提交”是什么意思?是指将下一个提交rebase到上一个提交吗?被删除的提交中的更改应该保留还是回滚? - Cory Kramer
这些提交所做的所有更改都应被删除。在这些提交之后,还有更多的提交。 - Dancyg
2个回答

10

您可以这样做:

  1. 基于您想要的起始提交创建一个新分支:

    git checkout -b <branch-name> <base-commit>
    
  2. 挑选所有没有匹配作者的提交记录:

    git log --author "<name>" --invert-grep --reverse --format="format:%H" HEAD..master | xargs git cherry-pick
    

    log过滤出所有由该作者提交的commit,然后一个一个地cherry-pick它们。

    以下是参数说明(部分引用自git log手册):

    • --author "name"
      仅输出符合指定模式(正则表达式)的作者/提交者头行的提交。使用多个--author=时,任何一个作者匹配到的提交都会被选择(同样适用于多个--committer=)。
    • --invert-grep
      仅输出log消息不匹配--grep=指定的模式的提交
    • --reverse 以相反顺序输出提交。[...]
    • --format="format:%H" 使用自定义格式,本例中仅输出提交哈希值

似乎git bash使用最后一次提交但未登录的作者进行提交。因此,我成功地重命名了错误作者下提交的提交。之后,我的同事提交了包含那些可恶提交错误作者的版本。然后出现了重复提交-相同但有不同作者的提交。 但当我再次重命名错误提交时,问题得到解决-它们就消失了,只剩下正确作者的提交。 - Dancyg
通常情况下,Git使用在.gitconfig中配置的作者,可以是本地仓库(.git/config)、用户或系统范围内的文件(按顺序排列)。您可以使用“git config --get-regexp“user.*””命令检查已配置的值。 - Andreas Wolf
希望这能为其他人节省时间:现在main分支可能是您想要在命令中使用的分支,因为它是github上的默认分支,而不是master。您需要在命令中使用...而不是..。此外,--author --invert-grep不再起作用;https://dev59.com/Vmw15IYBdhLWcg3wA28A#70644305请尝试使用以下命令:git log --perl-regexp --author='^((?!<NAME>).*)$' --reverse --format="format:%H" HEAD...main | xargs git cherry-pick - pdewilde

0

您可以直接使用filter-branch来完成。您可以创建一个新分支,指定起始点,然后使用filter branch进行cherry-pick到所需的提交,留下不需要的提交。

然后在您的新分支中,您将拥有所有提交,但不包括特定作者的提交。

git cherry-pick支持范围,因此您可以保存最后一个“好”的提交,然后添加一系列提交,而不是单个提交。

另一种方法是使用git revert,但是revert会保留原始提交,并仅撤消原始提交下所做的更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接