Git LFS迁移时存储空间暴涨的原因探究
历史提交的全量对象双存
git lfs migrate import会遍历仓库所有历史提交,把匹配规则的大文件从Git原生Blob转为LFS指针。但这个过程不会直接删除原Blob,而是为每一个历史版本的目标文件生成独立的LFS对象,原Git Blob仍保留在本地对象库中。如果仓库有大量提交且多次修改同一大文件,每一次版本的大文件都会生成新的LFS对象,加上原Blob的留存,相当于同一批文件存了两份甚至多份,直接推高存储占用。二进制文件的无增量存储特性
Git LFS对文件的存储依赖内容哈希,而二进制文件(如视频、设计稿、压缩包)的微小修改就会导致哈希完全变化,生成全新的LFS对象。不同于文本文件Git可以存储增量差异,LFS对二进制文件只能存储完整副本。如果你的仓库历史里有大量频繁修改的二进制文件,每一次修改都会新增一个完整的LFS对象,存储空间会随着修改次数呈线性甚至指数级增长。迁移过程的临时存储叠加
迁移执行时,Git LFS会在本地生成大量临时文件:它会先提取历史中的Blob,转换成LFS对象存入.git/lfs/objects目录,同时在对应提交中替换为LFS指针。这个阶段,原Blob、新LFS对象、临时处理文件会同时占用存储空间,直到迁移完成。仓库历史越深、大文件越多,这个叠加的临时存储占用就越高,也就是你看到的原40GB仓库在迁移中暴涨到200GB的核心原因之一。默认保留旧Git对象
git lfs migrate import默认不会自动清理原有的Git Blob对象。这些旧Blob依然占用仓库空间,而新生成的LFS对象又额外占用了一份存储,相当于同一批大文件的两份副本同时存在。只有手动执行清理命令才会释放旧Blob的空间,但在迁移过程中,这两份数据是同时存在的,直接导致存储量翻倍。
内容的提问来源于stack exchange,提问作者user4399002

