问题现象克隆一个仓库之后,打算切换到某个提交继续工作,却发现任何内容都检不出来。排查后发现,仓库里存在这样的文件路径:assets/images/logo@2x.png:Zone.Identifier其中包含冒号,而冒号在 Windows 的文件系统里是保留字符,不能出现在文件名中。于是 Git 在写盘时被拒绝,整个检出操作直接失败——不是一个文件失败,而是整个 checkout 都做不了,连那些文件名正常的文件也一起被挡住。由此产生两个需求:如何先把这个提交检出来,跳过那些有问题的文件;检出来之后,如何把缺失的文件以合法的新名字恢复出来。原因分析这些名字其实"来自" Windows首先要纠正一个误解:这类名字并不是非法路径,恰恰相反——它们本来就是 Windows 的产物。NTFS 用冒号分隔"文件名"与"流名"(stream name)。大多数文件只有一个未命名的数据流,但 Windows 允许一个文件携带多个流。而Zone.Identifier这个流名是浏览器专门用来标记"该文件系下载所得、通常不受信任"的,也就是常说的 Mark of the Web。