当开发者使用Git管理项目时,经常会遇到一个棘手的问题:如何上传超过100MB的大文件。Git本身并不是为管理大文件设计的,这会导致一系列问题:
我最近在管理一个C++项目时就遇到了这个问题。项目依赖的Boost库压缩包达到了127MB,直接推送时收到了GitHub的拒绝信息:
code复制remote: error: GH001: Large files detected.
remote: error: File boost_1_79_0.tar.gz is 127.90 MB; this exceeds GitHub's file size limit of 100.00 MB
这是最干净的解决方案,适用于不应该进入版本控制的文件(如第三方依赖包、构建产物等)。
具体操作步骤:
bash复制echo boost_1_79_0.tar.gz >> .gitignore
bash复制git rm --cached boost_1_79_0.tar.gz
bash复制git add .gitignore
git commit -m "Remove large archive and ignore it"
git push -u origin main --force
注意:如果文件已经存在于历史提交中,需要额外使用git filter-repo清理历史:
bash复制python -m pip install git-filter-repo
git filter-repo --path boost_1_79_0.tar.gz --invert-paths
git push -u origin main --force
当大文件确实需要纳入版本控制时,Git LFS是最佳选择。它的工作原理是将大文件存储在单独的服务器上,Git仓库中只保存指针文件。
配置流程:
bash复制git lfs install
bash复制git lfs track "*.tar.gz"
bash复制git add .gitattributes
git commit -m "Track tar.gz with Git LFS"
bash复制git add boost_1_79_0.tar.gz
git commit -m "Add boost archive via LFS"
git push -u origin main
当历史记录混乱或LFS配置出错时,可以考虑完全重建仓库:
bash复制rm -rf .git
git init
git branch -M main
bash复制git remote add origin git@github.com:user/repo.git
bash复制git lfs install
git lfs track "*.tar.gz"
bash复制git add .
git commit -m "Initial commit with LFS"
git push -u origin main
Windows系统下常见错误是Git相关进程未关闭导致安装失败。错误日志会显示:
code复制The following process(es) use Git for Windows:
MSYS2 terminal (PID 28248)
bash.exe (PID 20928)
解决方法:
powershell复制winget install GitHub.GitLFS
当Git安装在非默认路径(如D盘)时,安装程序可能会报错:
code复制An executable Git program was found in an unexpected location outside of Program Files:
"D:\Program Files\Git\cmd\git.exe"
解决方案有两种:
bash复制where.exe git-lfs
git lfs install
bash复制git lfs version
可以同时跟踪多种大文件类型:
bash复制git lfs track "*.zip"
git lfs track "*.7z"
git lfs track "*.bin"
git lfs track "*.dll"
确认文件是否被正确跟踪:
bash复制git lfs ls-files
克隆时需要额外步骤获取LFS文件:
bash复制git clone <repository>
git lfs pull
迁移包含LFS的仓库时,需要同时迁移LFS存储:
bash复制git lfs fetch --all
git push --mirror new-repo
git lfs push new-repo --all
我在实际项目中发现,合理使用Git LFS可以将仓库体积减少80%以上,同时将克隆时间从原来的30分钟缩短到2分钟。特别是在Unity、Unreal等游戏项目中,效果尤为明显。