Windows ReFS/Dev 驱动器上的零填充工作树文件:在将对象刷入磁盘之前检出它们的块克隆
作者: josh-sachs创建于 2026年7月30日更新于 2026年8月9日
标签bugwindows
描述错误
在 Windows ReFS 卷(包括 Dev 驱动器)上,git lfs checkout 通过块克隆从 .git/lfs/objects 中生成工作树文件(FSCTL_DUPLICATE_EXTENTS_TO_FILE)。块克隆仅映射磁盘上的集群,并且在克隆后,ReFS 保证了两个文件之间的隔离(在写入时分配)。当 checkout 在 git lfs fetch 之后不久运行时,一些对象数据仍然位于操作系统的写缓存中,而不是在磁盘上,因此克隆捕获了对象文件的磁盘状态,该文件为零。结果是工作树文件的长度正确,但内容部分或完全为零填充。对象存储本身是完好无损的:每个对象文件都通过其 SHA-256 文件名进行验证。克隆路径永远不会刷新源文件,并且没有配置来禁用克隆:
tools.CopyWithCallback(tools/iotools.go)在每次修补/检出时都会首先无条件地调用CloneFile。CloneFile/callDuplicateExtentsToFile(tools/util_windows.go)以 1 GB 的块大小发出FSCTL_DUPLICATE_EXTENTS_TO_FILE命令,在源文件上不进行FlushFileBuffers操作,并且不处理有效数据长度。
内容来源: git-lfs/git-lfs