科技 · 实用指南
Git LFS 提示文件本应是指针?在不丢工作副本的前提下修复索引
先保存文件,证明属性规则与 Git 对象在哪一层不一致,再选择窄范围重规范化或协同历史迁移,并用全新克隆验收。

这个警告通常表示 .gitattributes 要求该路径由 Git LFS 管理,但提交或索引仍把完整文件保存成普通 Git blob。clean 过滤器生成指针参与比较,因此 reset 后仍可能再次显示修改。
不要先运行 git reset --hard、删除 .git/lfs 或强推。先保存工作区字节,核对规则与对象,只修复必要范围,最后证明远端 LFS 对象可用。
1. 改动 Git 前先保存字节
执行 reset、checkout 或迁移前,把受影响文件复制到仓库外或记录加密哈希,同时保存 git status、路径和当前分支。
如果工作区还有无关修改就停下。最好在干净分支或一次性克隆中重规范化,并把保存副本放在仓库外。
2. 证明属性与对象错配
用 git check-attr -a -- path 找到实际生效规则,包括嵌套 .gitattributes 与大小写敏感模式。随后检查索引或 HEAD 对象类型,不覆盖工作文件。
真正的 LFS 指针是带版本、对象 ID 与大小的短文本。若路径受 LFS 管理而 HEAD 存的是完整 blob,警告说明表示层错配,不证明工作字节已变化。
3. 先修当前分支
对当前分支修复,明确预期规则,在干净树上对该路径执行 git add --renormalize -- path,并查看暂存差异。暂存内容应变成指针,工作文件仍保持可用字节。
只提交已审阅的规则与指针修正。它从该提交起修复本分支;其他受影响分支应逐一处理,不能假设一次提交覆盖所有引用。
4. 只有必要时才改写历史
仅当旧提交必须转换或托管限制仍发现历史大文件时使用 git lfs migrate。在一次性克隆中测试 --no-rewrite 或 import --fixup,并列出精确引用。
历史迁移会改变提交 ID,可能需要协同强推、调整分支保护与让成员重新克隆。先备份引用并安排切换,不要在共享远端试探范围。
5. 验证指针与远端对象
对选定范围运行 git lfs fsck --pointers,并用 git lfs fsck 检查本地对象。推送前核对 git lfs ls-files 以及暂存或提交指针的 OID。
既要推 Git 引用,也要确保 LFS 对象上传。Git push 成功或状态干净都不能证明大对象已到远端。保留原文件与恢复文件哈希。
6. 仅接受全新克隆结果
在空目录中安装 Git LFS 后全新克隆,检出修复引用,确认没有指针警告或假修改,并比较恢复文件与保存原件的哈希和大小。
只有属性、提交指针、远端 LFS 对象与全新工作文件一致时才验收。在另一位协作者或 CI 克隆通过前保留备份。
