删除作者的所有提交

时间:2016-08-30 16:35:31

标签: 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/*'

是否有一些过滤器不能重命名但是删除了这样的提交?

2 个答案:

答案 0 :(得分:5)

你可以这样做:

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

    git checkout -b <branch-name> <base-commit>
    
  2. Cherry-pick所有没有匹配作者的提交:

    git log --author "<name>" --invert-grep --reverse --format="format:%H" HEAD..master | xargs git cherry-pick
    
  3. log过滤掉作者提交的所有提交,然后cherry-pick逐个过滤。

    参数说明(部分引自git log联机帮助页):

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

答案 1 :(得分:0)

您可以使用过滤器分支直接执行此操作。您可以做的是创建一个具有所需起点的新分支,然后使用过滤器分支对所需的提交执行cherry-pick,从而省去不需要的提交。

然后在你的新分支中,你将获得所有提交,而不是给定作者提交的。

git cherry-pick支持范围,以便您可以保存最后一个&#34; good&#34;提交并添加一系列提交而不是单个提交。

另一种方法是执行git revert但是revert将保留原始提交,并且只撤消在原始提交下进行的更改。