在内部,Git 始终将文件名存储为字节序列,并且不执行任何编码或大小写转换。但是,Windows 和 macOS 默认情况下都对文件名执行大小写转换。因此,最终可能会出现多个文件或目录,其名称仅在大小写上有所不同。Git 可以很好地处理这种情况,但文件系统只能存储其中一个文件,因此当 Git 读取另一个文件以查看其内容时,它看起来已被修改。
最好删除其中一个文件,以便您只有一个文件。您可以使用以下命令(假设在其他干净的工作树上存在两个文件 AFile.txt
和 afile.txt
)执行此操作
$ git rm --cached AFile.txt
$ git commit -m 'Remove files conflicting in case'
$ git checkout .
这样可以避免接触磁盘,但会删除附加文件。你的项目可能更喜欢采用命名约定,例如全小写名称,以避免此问题再次发生;可以使用pre-receive
钩子或作为持续集成 (CI) 系统的一部分来检查此类约定。
如果你的系统正在使用污点或清理过滤器,但之前已提交文件而未运行污点或清理过滤器,则任何平台上都可能出现永久修改的文件。要解决此问题,请在其他干净的工作树上运行以下内容
$ git add --renormalize .