问题描述
由于Linux文件名区分大小写,而Windows不区分,在平时开发过程中,就会遇到各种关于文件名大小写的问题,如下面两种场景:
- 1、git对文件名的大小写不敏感:
– 创建一个文件readme.md,提交到代码仓库;
– 接着在本地文件系统中将其修改为Readme.md;
– 接着去提交,发现代码没有变化,输入git status 也不显示任何信息。
- 2、Windows对文件名大小写不敏感:
– 在Windows上git clone Linux内核源码时,会因为Windows不区分文件名的大小写遇到类似下面的问题:
git clone git@github.com:qxhgd/Reading-and-comprehense-linux-Kernel-network-protocol-stack-4.19.157.git Cloning into 'Reading-and-comprehense-linux-Kernel-network-protocol-stack-4.19.157'... remote: Enumerating objects: 2198, done. remote: Counting objects: 100% (2198/2198), done. remote: Compressing objects: 100% (2081/2081), done. remote: Total 2198 (delta 111), reused 2190 (delta 106), pack-reused 0 Receiving objects: 100% (2198/2198), 7.56 MiB | 322.00 KiB/s, done. Resolving deltas: 100% (111/111), done. 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: 'linux-net-kernel/net/netfilter/xt_DSCP.c' 'linux-net-kernel/net/netfilter/xt_dscp.c' 'linux-net-kernel/net/netfilter/xt_HL.c' 'linux-net-kernel/net/netfilter/xt_hl.c' 'linux-net-kernel/net/netfilter/xt_RATEEST.c' 'linux-net-kernel/net/netfilter/xt_rateest.c' 'linux-net-kernel/net/netfilter/xt_TCPMSS.c' 'linux-net-kernel/net/netfilter/xt_tcpmss.c'
git对文件名的大小写不敏感
该问题,有两个解决方案。
- 使用git的重命名操作,而非Windows文件系统的重命名操作
git mv OldFileName newfilename
- 配置git对文件名敏感
git config core.ignorecase false
Windows对文件名大小写不敏感
这里仅以Win10为例来说明,Win7系统可参考后文参考资料《how-do-you-make-windows-7-fully-case-sensitive-with-respect-to-the-filesystem》。
- 环境要求
以下条件,缺一不可:
Windows 10 四月更新(1803)
安装有 Linux 子系统,即 Windows Subsystem for Linux(WSL)
所在分区为 NTFS 格式
以管理员权限运行 PowerShell
- fsutil命令开启大小写敏感:
fsutil.exe file SetCaseSensitiveInfo C:\Users\qxhgd\GitProject enable #假定需要操作C:\Users\qxhgd\GitProject目录
注意,该命令仅以目录为操作的最小粒度。
本文涉及命令汇总
- git配置大小写
- 命令方式:
git config core.ignorecase false #git区分大小写 git config core.ignorecase true #git忽略大小写 git config --unset core.ignorecase #git忽略大小写 git config core.ignorecase #查看是否区分大小写 git config --list #查看core.ignorecase参数的值
– 配置文件方式,修改.gitconfig:
[core] ignorecase = false
- git配置忽略文件权限修改
git config --global core.filemode false
- git重命名文件
git mv oldfile(旧文件名) newfile(新文件名)
- win10配置大小写-使用fsutil命令:
fsutil.exe file SetCaseSensitiveInfo C:\Users\qxhgd\GitProject enable #打开文件名区分大小写 fsutil.exe file SetCaseSensitiveInfo C:\Users\qxhgd\GitProject disable #关闭文件名区分大小写
- fsutil命令其他参数:
PS C:\Windows\system32> fsutil.exe ---- 支持的命令 ---- 8dot3name 8dot3name 管理 behavior 控制文件系统行为 dax Dax 卷管理 dirty 管理卷更改位 file 文件特定命令 fsInfo 文件系统信息 hardlink 硬链接管理 objectID 对象 ID 管理 quota 配额管理 repair 自愈管理 reparsePoint 重分析点管理 storageReserve 存储保留管理 resource 事务性资源管理器管理 sparse 稀疏文件控制 tiering 存储分层属性管理 transaction 事务管理 usn USN 管理 volume 卷管理 wim 透明 wim 托管管理 PS C:\Windows\system32> fsutil.exe file help ---- 支持的 FILE 命令 ---- createNew 创建指定大小的新文件 findBySID 按安全标识符查找文件 layout 查询有关该文件的所有可用信息 optimizeMetadata 优化文件的元数据 queryAllocRanges 查询文件的分配范围 queryCaseSensitiveInfo 查询目录的大小写信息 queryExtents 查询文件的范围 queryExtentsAndRefCounts 查询文件的范围及其相应的引用计数 queryFileID 查询指定文件的文件 ID queryFileNameById 显示文件 ID 的随机链接名称 queryOptimizeMetadata 查询文件的优化元数据状态 queryValidData 查询文件的有效数据长度 setCaseSensitiveInfo 设置目录的大小写信息 setShortName 设置文件的短名称 setValidData 设置文件的有效数据长度 setZeroData 设置文件的零数据 setEOF 为现有文件设置文件结尾 setStrictlySequential 将 ReFS SMR 文件设置为严格按顺序 PS C:\Windows\system32>