POST git-receive-pack后git push挂起失败,如何配置正确的.gitignore?
问题根因
你之前配置的忽略规则不生效有两个核心原因:
.gitignore仅对未被Git追踪的新增文件生效,你要忽略的大文件已经被加入了本地Git的历史提交记录,所以就算新增了忽略规则,历史中的大文件依然会被推送到远程仓库。- 你编写的相对路径规则匹配范围错误,比如
Models/*仅匹配仓库根目录下的Models文件夹,无法命中深层目录src/Video/Models/下的文件。
适配当前目录的.gitignore规则
以下规则可完全匹配你的目录结构,按需忽略指定文件:
# 忽略编辑器与运行环境缓存 .vscode/ .ipynb_checkpoints/ __pycache__/ *.pyc *.pyo # 全局忽略指定后缀大文件 *.png *.mp4 *.h5 # 若需要保留部分指定后缀的文件,可添加!前缀反选,示例如下: # !src/Game/ui/*.png # 显式忽略大文件目录(可选,和上面全局后缀规则二选一即可,精准度更高) # src/Video/Images/ # src/Video/Models/ # src/Video/Videos/
解决推送失败的操作步骤
配置完.gitignore后需要先清理本地Git历史中的大文件,再执行推送:
- 先提交当前所有修改,保证工作区干净:
git add . git commit -m "update .gitignore rules"
- 清理历史提交中的大文件,可选用
git filter-repo工具(Git 2.22及以上版本默认支持)执行以下命令:
# 移除所有历史提交中的h5文件 git filter-repo --path-glob '*.h5' --invert-paths # 移除所有历史提交中的mp4文件 git filter-repo --path-glob '*.mp4' --invert-paths # 移除所有历史提交中的png文件 git filter-repo --path-glob '*.png' --invert-paths
如果你习惯使用git filter-branch,也可以执行以下命令:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *.mp4 *.h5 *.png' --prune-empty --tag-name-filter cat -- --all
- 清理完成后执行强制推送即可:
git push --force origin master
如果后续需要托管大体积的模型、视频文件,可以使用Git LFS管理。
内容的提问来源于stack exchange,提问作者romhayh
相关产品推荐
相关产品推荐

