删除作者的所有提交
Remove all commits by author
如何删除某个作者的所有提交(错误提交 - 这样的作者不应该在提交历史记录中可见)。
我找到了一些要重命名的代码 -
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/*'
是否有一些过滤器不重命名而是删除此类提交?
您可以直接使用过滤器分支来完成。您可以做的是创建一个具有所需起点的新分支,然后使用过滤器分支对所需的提交执行 cherry-pick
,留下不需要的提交。
然后在您的新分支中,您将拥有所有提交,但不包括给定作者所做的提交。
git cherry-pick
支持一个范围,因此您可以保存最后一个 "good" 提交,然后添加一系列提交而不是单个提交。
另一种方法是执行 git revert
,但还原将保留原始提交,并且只会撤消在原始提交下所做的更改。
你可以这样做:
根据您要开始的提交创建一个新分支:
git checkout -b <branch-name> <base-commit>
Cherry-pick 所有没有匹配作者的提交:
git log --author "<name>" --invert-grep --reverse --format="format:%H" HEAD..master | xargs git cherry-pick
log
过滤掉作者所做的所有提交,然后 cherry-pick
将它们一一提交。
参数说明(部分引用自 git log
联机帮助页):
--author "name"
将提交输出限制为具有匹配指定模式(正则表达式)的 author/committer header 行。有多个 --author=,提交其作者匹配任何给定的
选择模式(类似于多个 --committer=)。
--invert-grep
将提交输出限制为日志消息与 --grep= 指定的模式不匹配的输出
--reverse
以相反的顺序输出提交。 […]
--format="format:%H"
使用自定义格式,在本例中仅提交哈希
如何删除某个作者的所有提交(错误提交 - 这样的作者不应该在提交历史记录中可见)。
我找到了一些要重命名的代码 -
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/*'
是否有一些过滤器不重命名而是删除此类提交?
您可以直接使用过滤器分支来完成。您可以做的是创建一个具有所需起点的新分支,然后使用过滤器分支对所需的提交执行 cherry-pick
,留下不需要的提交。
然后在您的新分支中,您将拥有所有提交,但不包括给定作者所做的提交。
git cherry-pick
支持一个范围,因此您可以保存最后一个 "good" 提交,然后添加一系列提交而不是单个提交。
另一种方法是执行 git revert
,但还原将保留原始提交,并且只会撤消在原始提交下所做的更改。
你可以这样做:
根据您要开始的提交创建一个新分支:
git checkout -b <branch-name> <base-commit>
Cherry-pick 所有没有匹配作者的提交:
git log --author "<name>" --invert-grep --reverse --format="format:%H" HEAD..master | xargs git cherry-pick
log
过滤掉作者所做的所有提交,然后 cherry-pick
将它们一一提交。
参数说明(部分引用自 git log
联机帮助页):
--author "name"
将提交输出限制为具有匹配指定模式(正则表达式)的 author/committer header 行。有多个 --author=,提交其作者匹配任何给定的 选择模式(类似于多个 --committer=)。--invert-grep
将提交输出限制为日志消息与 --grep= 指定的模式不匹配的输出
--reverse
以相反的顺序输出提交。 […]--format="format:%H"
使用自定义格式,在本例中仅提交哈希