日期:2026年1月8日 摘要:删除提交历史中的文件夹
【question】 如何删除已经提交github的文件夹以及提交仓库中的历史
【try to solve】 下面给出删除已提交文件夹及其历史记录的常用做法:
1) 如果只想在后续版本移除(保留历史):
- 本地删除文件夹:
rm -rf <folder> - 提交并推送:
git add -A && git commit -m "remove <folder>" && git push - 历史仍保留;仅当前与未来版本不再包含该目录。
2) 彻底从历史抹除(重写历史,需强推,团队先沟通):
- 备份仓库,确认无未推送工作。
- 安装
git filter-repo(推荐替代 BFG):
brew install git-filter-repo # macOS
- 重写历史移除目录(示例移除 secret-folder):
git filter-repo --path secret-folder --invert-paths
- 多个目录可重复
--path <dir>。 - 若需清理大文件,可用
--strip-blobs-bigger-than 10M。 - 检查结果:
git log --stat | head、确认目标目录消失。 - 强制推送覆盖远端:
git push --force --all
git push --force --tags
- 如是公共仓库,提醒协作者重新克隆或
git fetch --all && git reset --hard origin/main(会丢本地改动)。
3) GitHub UI 删除 release/attachements(可选)
- 若有 release 附带大文件,需到 GitHub Release 页面手动移除后再重推。
4) 防止再次提交
- 将目录加入
.gitignore:在.gitignore追加<folder>/,再提交。
风险与注意事项
- 重写历史会改变提交哈希,已克隆的开发者必须重新同步;在多人协作时务必事先沟通。
- 公共仓库如曾被 fork,fork 中的历史仍会保留;无法完全抹除公开副本。
如需我直接在当前仓库清理指定目录,请告知目录名;若需仅删除最新版本不改历史,也请说明。