以下情况:我有一个带有很多提交的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其他提交的其他事情也完成了。如何删除这些提交的最后痕迹?
答案 0 :(得分:1)
删除提交的规范指南是here。它实质上提供了两条路线,git-filter-branch
和bfg
。
但是,如果您的意思是完全删除,那么您在此过程中缺少第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而不是合并的评论。