.gitignore删除缓存后仍不生效 无法排除已提交的大文件目录
问题原因
- 你执行的
git rm --cache仅移除了当前工作区暂存的_data目录追踪,但是之前的提交记录里已经存入了这个大体积tsv文件,GitHub推送时会校验所有提交历史里的文件大小,所以就算你后续删除了本地文件、加了.gitignore,历史里的文件还是会触发大小限制报错。 - 你配置的
.gitignore规则/_data/仅会忽略当前.gitignore所在目录下的根级_data目录,此处规则匹配是正确的,配置本身没有问题。
解决方案
操作前建议先备份整个仓库目录,避免误操作丢失文件;下述方案涉及强制推送,会覆盖远端的提交历史,若有其他协作者共同维护仓库,需要提前通知所有人后续重新拉取最新代码,避免历史冲突。
方案1:仅删除指定大文件的所有历史记录(适合只需要清理这一个大文件的场景)
- 确保当前工作区所有变更都已提交,没有未保存的修改
- 执行以下命令清理所有历史提交中的指定大文件:
git filter-repo --invert-paths --path work/foo/_data/XXX.tsv
如果你的Git版本未预装git filter-repo,也可以使用旧版兼容命令:git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch work/foo/_data/XXX.tsv' --prune-empty --tag-name-filter cat -- --all - 清理完成后重新推送:
git push origin main --force
方案2:清理所有未追踪的_data目录相关的历史记录(适合整个_data目录都不需要被追踪的场景)
- 同样先确保本地无未提交变更
- 执行命令清理所有历史中的_data目录:
git filter-repo --invert-paths --path foo/_data/
未预装git filter-repo可使用兼容命令:git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch foo/_data/*' --prune-empty --tag-name-filter cat -- --all - 确认.gitignore里的
/_data/规则已经正确配置,执行git add . && git commit -m "chore: 忽略_data目录" - 强制推送到远端:
git push origin main --force
内容的提问来源于stack exchange,提问作者Yosher
相关产品推荐
相关产品推荐

