.gitignore配置清缓存后仍不生效,GitHub推送大文件报错解决
问题原因
报错本质是对Git和GitHub的两个机制存在认知偏差:
.gitignore规则仅对从未被Git纳入跟踪的文件生效。只要文件曾经被git add加入过本地Git索引,哪怕从来没推送到远程仓库,后续再加忽略规则也不会自动把它从已有的提交记录里移除。- GitHub推送时的大文件校验,会扫描本次待推送的所有提交中的每一个文件对象,不是只检查最新一次提交的文件状态。你虽然在最新提交里删除了
latin/files/lasla_db.pkl,但这个217MB的文件早就存在于本地领先远程的未推送提交历史中,推送时这些历史提交里的大文件会被一并传到GitHub,自然会触发100MB的单文件大小限制拦截。
顺便提一句,你之前执行缓存清理时敲错了文件名,命令里写的是lasla_db2.pkl,和实际要处理的lasla_db.pkl不是同一个文件,但这不是核心诱因——就算你当时删对了缓存、提交了删除操作,只要历史提交里留存过大文件,一样会被拦截。
解决方法
按顺序执行以下操作,把大文件从本地所有提交历史里彻底清除后即可正常推送:
- 遍历所有本地提交,删除全量历史记录里的目标大文件:
git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch latin/files/lasla_db.pkl' \ --prune-empty -- --all
- 清理Git残留的备份引用和冗余对象,彻底删除大文件的缓存碎片:
rm -rf .git/refs/original/ git reflog expire --expire=now --all git gc --prune=now --aggressive
- 执行
git status确认仓库状态无异常后,重新运行git push -u origin master即可完成推送。
后续避坑:新增
.gitignore规则后,先执行git check-ignore -v <文件路径>验证规则是否真的匹配到了目标文件,确认文件不会被Git跟踪之后再执行git add .提交,就能避免这类大文件误提交的问题。
内容的提问来源于stack exchange,提问作者bobsmith76
相关产品推荐
相关产品推荐

