git lfs 无法丢弃文件更改(遇到本应是指针的文件)

git lfs cannot discard file changes (encountered files that should have been pointers)

我有一个使用 git lfs 的文件,但即使我没有做任何事情,它也只是在 git 上显示为有更改。我无法放弃这些更改,无论是通过 VS Code UI、git 重置还是 git 恢复。

Git 一直告诉我“遇到 1 个本应是指针但不是指针的文件:”

我知道 Git error: Encountered 7 file(s) that should have been pointers, but weren't 上的讨论帖,但我已经尝试了那里的所有解决方案并且 none 对他们有帮助。

这是 Git 的限制,原因是有人在没有使用 Git LFS 的情况下提交了由 Git LFS 跟踪的文件。 Git 常见问题 mentions this briefly.

发生这种情况是因为当文件在工作树中被标记为已修改时,Git 运行通过清理过滤器(即 Git LFS)查看它是否已经改变。当发生这种情况时,Git LFS 将它变成一个指针文件,但索引中的文件是一个完整的 Git 文件,因此它被标记为已修改。尝试使用 git reset --hard 不会改变事情,因为 Git 仍然将它写入树并要求 Git LFS 以相同的方式清理它,所以没有任何改变。

Git LFS 无法控制此行为,也无法检测到它,因为 Git 没有提供一种方法来指示用户是否 运行ning git reset --hard 或不。对于干净的工作树,您需要 运行 git add --renormalize . 并提交。在那之后,该文件将变成 LFS 文件,并且不会再发生这种情况。请注意,进行此更改的提交必须出现在每个受影响的分支上才能修复它。

如果你有CI设置,你可以使用Git LFS 3.0.1或更高版本到运行 git lfs fsck --pointers来检查所有文件是否都是正确的LFS文件并拒绝任何失败的提交。可以看到the manual page for more details.