通过压缩Git提交历史节省存储空间的可行方案咨询
方案一:保留提交历史并清理大文件(推荐需保留历史的场景)
你的核心问题是历史提交中积累了大量二进制文件(含原Git LFS托管的资源),Git对二进制文件的快照存储机制(改动时生成完整新版本)导致了严重的体积冗余。以下是可保留提交历史的清理方案:
先备份仓库
重写Git历史是不可逆操作,务必先复制整个仓库文件夹到安全位置,避免数据丢失。安装
git filter-repo
这是官方推荐替代git filter-branch的高效工具,根据系统安装:- Linux:包管理器安装(如
apt install git-filter-repo) - macOS:Homebrew安装(
brew install git-filter-repo) - Windows:下载官方二进制文件并添加到环境变量
- Linux:包管理器安装(如
定位大文件
运行以下命令找出仓库中体积最大的20个对象,明确需要清理的文件类型或具体路径:git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -20输出第三列为文件大小(字节),可直接定位占用空间最多的资源。
重写历史移除大文件
根据定位结果,用git filter-repo移除所有历史中的目标文件:- 移除特定类型的资源(如所有图片、音频、3D模型):
git filter-repo --path-glob '*.png' --invert-paths git filter-repo --path-glob '*.mp3' --invert-paths git filter-repo --path-glob '*.fbx' --invert-paths - 移除单个具体文件:
git filter-repo --path 'Assets/Textures/LargeBackground.png' --invert-paths
若曾用Git LFS,可查看
.gitattributes的追踪规则,对应移除所有LFS托管过的文件类型。- 移除特定类型的资源(如所有图片、音频、3D模型):
压缩本地仓库
清理历史后,移除本地冗余的Git对象:git reflog expire --expire=now --all git gc --prune=now --aggressive强制推送到GitHub
由于重写了历史,需强制覆盖远程仓库:git push origin --force --all git push origin --force --tags注意:若有其他开发者克隆过此仓库,他们的本地仓库会与远程不一致,需重新克隆或手动同步。
方案二:丢弃历史,只保留最终版本(最快最彻底的压缩)
若无需保留提交历史,仅需展示最终项目代码,此方法最直接:
创建无历史的新分支:
git checkout --orphan new-main添加当前所有文件并提交:
git add . git commit -m "Final game release"替换原主分支:
git branch -D main git branch -m main强制推送到GitHub:
git push origin main --force
额外优化:完善
.gitignore配置 避免Unity自动生成文件占用仓库空间,在.gitignore中添加:
# Unity autogenerated files Library/ Temp/ Obj/ Logs/ UserSettings/ *.pidb *.pdb *.unityproj *.sln *.suo *.user *.userprefs *.pidb.meta
内容的提问来源于stack exchange,提问作者ghosts
相关产品推荐
相关产品推荐

