git 仓库中文件名大小写问题

989 阅读2分钟
git config --get core.ignorecase   # 查看大小写是否敏感

问题描述:

如果分支上直接在编辑器或资源管理器上修改项目中的文件名(只变更大小写),本地虽然可以调试通过,
但是 git 并不会识别和记录这个修改,所以下一次提交推送时并不会带上这个重命名修改,远程仓库中这个文件名还是保持不变;

因此,如果检出其他分支或者其他协作者拉取代码,项目就会报错

  • 因为一个本地文件的名称如果从小写变成大写,使用这个文件的代码也改成了大写;
    推送到远程后,远程的这个文件依然是小写,但远程上使用该文件的代码中成功改成了大写;
    所以,启动项目就会提示文件不存在

方法一:规范重命名

先把文件夹命名成其他名称,然后再命名为大写就行了

git mv test-dir tmp
git mv tmp TEST-DIR
------------
# rename test.txt --> tmp
git add .
git commit -m "..."

# rename tmp --> TEST.TXT
git add .
git commit -m "..."

git push

方法二:修改大小写配置(不推荐)

修改 git 配置为不忽略大小写:git config core.ignorecase false

然后直接在资源管理器或编辑器中修改文件名大小写,git 就会识别到了,而且是被识别为 untracked 类型的变更,这依然是 Windows 下对文件名大小写不敏感导致的

如果直接推送到远程的话,那么远程仓库就会同时存在大小写两个版本的文件(github/gitlab 服务器通常都是 Linux 系统),为后期维护添加隐患,本地在分支间切换时也可能出现以下报错:

error: The following untracked working tree files would be overwritten by checkout:
        test.txt
Please move or remove them before you switch branches.
Aborting

这种情况下依然需要使用方法一来解决