GitHub 大文件推送避坑指南
问题现象
当你执行 git push 时,可能会遇到类似以下错误提示:
remote: error: File data/wmt_zh_en_training_corpus.csv is 1968.67 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected. You may want to try Git Large File Storage.
! [remote rejected] master -> master (pre-receive hook declined)
根本原因
GitHub 对单个文件的大小限制为 ≤ 100MB。即使你在后续提交中删除了该大文件,它在 Git 的历史记录中仍然存在,导致推送失败。解决此问题的关键在于清理仓库历史中的大文件记录,或者使用 Git LFS(Large File Storage)来管理大文件。
方案一:Git LFS(官方推荐,保留完整版本历史)
Git LFS 的核心思想是将仓库中的大文件替换为轻量级的指针文件,实际的大文件内容则存储在远端的 LFS 服务器上。这样,你的 Git 仓库体积就能保持轻量。
步骤 1 · 安装并初始化 LFS
- 访问 https://git-lfs.github.com/ 下载并安装对应你操作系统的 Git LFS。
安装完成后,在终端(命令行)中执行一次全局初始化:
git lfs install
步骤 2 · 跟踪大文件类型(或单个文件)
假设你的大文件是 .csv 格式(请根据实际情况替换扩展名或路径),使用以下命令跟踪:
git lfs track "*.csv" # 或者精确指定文件路径
# git lfs track "data/wmt_zh_en_training_corpus.csv"
此命令会在你的仓库根目录生成或修改 .gitattributes 文件。必须将此文件加入版本库并提交:
git add .gitattributes
git commit -m "chore: 配置 Git LFS 跟踪 csv 文件"
步骤 3 · 迁移已有历史中的大文件到 LFS(关键!)
由于大文件已经存在于之前的提交历史中,我们需要使用 git lfs migrate 命令重写历史,将这些文件替换为 LFS 指针:
git lfs migrate import --include="data/wmt_zh_en_training_corpus.csv" --everything
--include:指定要转换的文件路径(支持逗号分隔多个文件,也支持通配符*)。--everything:转换所有分支和标签的历史记录。- 注意:此操作会修改历史提交的 SHA 哈希值,后续需要强制推送。
执行后,验证迁移结果:
git lfs ls-files # 应列出被 LFS 管理的文件

