删除作者的所有提交

Dan*_*cyg 5 git git-filter

如何删除某个作者的所有提交(错误提交 - 这样的作者不应该在提交历史中可见).

我找到了一些要重命名的代码 -

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/*'
Run Code Online (Sandbox Code Playgroud)

是否有一些过滤器不重命名但删除此类提交?

小智 7

你可以这样做:

  1. 根据您要开始的提交创建一个新分支:

    git checkout -b <branch-name> <base-commit>
    
    Run Code Online (Sandbox Code Playgroud)
  2. Cherry-pick所有没有匹配作者的提交:

    git log --author "<name>" --invert-grep --reverse --format="format:%H" HEAD..master | xargs git cherry-pick
    
    Run Code Online (Sandbox Code Playgroud)

log过滤掉所有的提交了提交人,然后cherry-pickŞ他们一一之后.

参数说明(部分引用自git log填充表):

  • --author "name"
    将提交输出限制为具有与指定模式(正则表达式)匹配的作者/提交者标题行的输出.如果有多个--author =,则会选择其作者与任何给定模式匹配的提交(类似于多个--committer =).
  • --invert-grep
    将提交输出限制为具有与--grep =指定的模式不匹配的日志消息的输出
  • --reverse 以相反的顺序输出提交.[...]
  • --format="format:%H" 使用自定义格式,在这种情况下只提交提交哈希