Linux 天然支持文件名大小写区分,同一目录下 abc 和 ABC 是两个独立的文件。Mac OS 也可以通过格式化时选择区分大小写的文件系统来实现。Windows 默认不支持,NTFS 虽然存储时保留大小写,但查找时始终不区分。
问题来源
在 Windows 上执行 git clone 克隆某个 Linux 内核相关仓库时,出现了下面的警告:
warning: the following paths have collided (e.g. case-sensitive paths
on a case-insensitive filesystem) and only one from the same
colliding group is in the working tree:
'include/uapi/linux/netfilter/xt_CONNMARK.h'
'include/uapi/linux/netfilter/xt_connmark.h'
'include/uapi/linux/netfilter/xt_DSCP.h'
原因很直接:仓库里同时存在大写和小写的同名文件,在"不区分大小写"的 Windows 文件系统上,后克隆的文件把先克隆的直接覆盖了,Git 检测到冲突就报了这个 warning。
解决方法
有两种方式可以解决:在 WSL2 终端里操作,或者用 fsutil.exe 给指定目录开启大小写敏感。
用管理员身份打开 cmd 或 PowerShell,切到 C:\Windows\System32,执行:
fsutil.exe file SetCaseSensitiveInfo E:\github_code enable
成功的话会看到:
PS C:\Windows\System32> fsutil.exe file SetCaseSensitiveInfo E:\github_code enable
已启用目录 E:\github_code 的区分大小写属性。
这个设置只对指定目录生效,不影响系统其他地方。
前提条件
以下四点缺一不可,否则命令会失败或报错:
- Windows 10 需要 1803(2018 年 4 月更新)或更高版本
- 已安装 WSL(Windows Subsystem for Linux)
- 目标目录所在分区为 NTFS 格式
- 以管理员身份运行终端