2022年4月27日
# 拉取仓库代码时遇到的问题
今天拉取仓库代码时遇到一个问题,项目中有两个同级目录下大小写不同的文件夹,比如 WorkProject 和 workProject。
当你在windows 10 操作系统中拉取的时候,发现报错了,说不能有两个同名的目录或者文件。于是乎我研究了一下,发现在win10操作系统中是忽略文件、目录名大小写的,git中也是这样的,甚至vscode中也是如此。
# 先解决win10操作系统中忽略文件、目录名大小写的问题
https://cloud.tencent.com/developer/ask/sof/252591 (opens new window)
先通过管理员权限打开powershell,然后敲如下命令,用来安装 Windows Subsystem for Linux
,然后控制台就会显示让你重启系统,选择y 回车。
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
重启电脑后,通过fsutil.exe 开启指定目录的大小写敏感。
# 比如 fsutil.exe file SetCaseSensitiveInfo E:\work-2022 enable
# 这样 E:\work-2022目录下就会开启大小写敏感模式了
fsutil.exe file SetCaseSensitiveInfo <你要开启大小写敏感的目录> enable
# 再解决git忽略文件、目录名大小写的问题
通过配置git的core模块,就能够让git正常拉取同级目录下有两个大小写不同的文件夹的项目了。
# 在当前git仓库目录下 设置 关闭git忽略文件、目录名大小写
git config core.ignorecase false
# 在全局设置 关闭git忽略文件、目录名大小写
git config --global core.ignorecase false
# 再解决vscode忽略文件、目录名大小写的问题
抱歉暂时没找到,似乎没法解决。但从逻辑上来说应该也可以解决。
你会发现一个奇怪的现象,明明windows资源目录中有,但是vscode只能识别小写的文件目录,而大写的识别不出来,这个就很头痛了。最好还是整理一下文件目录名,要么改目录名,要么删除掉一个。
规范起来,vscode就不会出现这种问题了。
# 总结
一个文件夹下存在 大小写被忽略后相同的文件或文件名会造成操作系统、git、编辑器层面上的bug。这是不规范命名和早期不注意导致的问题,非常难以解决。
比如你先创建了一个 about目录,后面你把about改为About,再提交到git仓库中,实际上git会认为你新增了一个About,而原来的about还会存在git仓库中。
当然也可以通过其它方式解决,比如把项目代码拉过来,这时会出现一个about和About,你把这两个文件夹都删掉,然后提交代码。
这时远程仓库中的about和About都会被删除,最后你再把你想要的那个About从回收站中找回来,然后再把这个About提交上去即可。
当然这么麻烦的处理步骤实在不可取,预防胜于检查,所以一开始就要注意这个点,否则出了问题也很难整。比如我处理这个问题就花了一个多小时,非常的心累。
# 扩展
当你使用了git config core.ignorecase false
之后,把修改大小写的文件夹也改了,这时推送到远程分支,会发现远程分支上出现大小写文件夹重复的情况。
这时就要删除多余重复的文件,比如你有about 和 About两个,你想删除about然后保留About,可以这样做。
# 通过git删除缓存中指定目录名称下面所有的文件(包括文件名)
git rm --cached src/components/about -r
# 如果要删除多个目录的话,可以这样,这样就删除了 about about2 about3 这三个目录
git rm --cached src/components/about src/components/about2 src/components/about3 -r
删除成功后,控制台就会显示如下内容。这是告诉你删除了指定目录下的所有文件。
rm 'src/components/about/index.scss'
rm 'src/components/about/index.tsx'
最后你推送到远程分支上,就成功了。