完全删除git commit

时间:2015-09-25 17:00:23

标签: git github version-control

以下情况:我有一个带有很多提交的git repo,我想删除一个在一些提交中引入的文件,最后在提交中删除。所以现在我想完全从我的仓库中删除提交,因此确实:

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch UNWANTED_FILE' --prune-empty --tag-name-filter cat -- --all git push -f origin master

这很好用,我的历史被重写了(几个提交都被重写了。但是:

git log --all -- UNWANTED_FILE

我仍然会看到两个条目,即提交只不过是删除文件并添加文件已完成。

Alll其他提交的其他事情也完成了。如何删除这些提交的最后痕迹?

1 个答案:

答案 0 :(得分:1)

删除提交的规范指南是here。它实质上提供了两条路线,git-filter-branchbfg

但是,如果您的意思是完全删除,那么您在此过程中缺少第9步,即:

git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

实际上会删除未使用的引用。

另请注意,如果这些数据是应该从未提交的敏感数据,或者它们非常庞大(因此您不希望git pull再次将其删除),则需要确保他们被删除:

  • 上游回购(以及任何其他上游回购)
  • 所有合作者的回购(因此他们不会将其推回) - 通常更容易让他们删除回购并重新回复。

还要注意关于让协作者进行rebase而不是合并的评论。