项目开发的时候给文件重命名是常见的操作。但如果仅仅是改变了大小写会怎样呢?
λ ls
README.txt
λ mv README.txt Readme.txt
λ git status
On branch master
nothing to commit, working tree clean
竟然完全不生效…
说到为什么会这样,不知道大家有没有注意到,windows文件系统是不区分文件大小写的。
比如当我要把如下一个文件命名为README.txt,因为已经存在了一个Readme.txt文件,所以这个操作是不被允许的。

所以windows下,git会在初始化仓库的时候自动配置.config来让git的的文件大小写规则与系统一致。初始化的情况包含git init 以及 git clone。以下我执行了git init 并查看默认配置:

没想到吧,Git默认已经把忽略大小写的这个选项ignorecase设置为了true,也就是不区分大小写。(这个单词的意思是:是否忽略大小写…设置为true,就是忽略的意思)
所以理论上,只要把他改回来就可以了。不妨试一下:
# 可以看到我已经设置为了false
λ git config -l | grep "case"
core.ignorecase=false
# 新建一个文件
git touch README.txt
# 添加并提交
git add .
git commit -m "init";
# 重命名
mv README.txt Readme.txt
# 可以看到已经检测到文件名发生改变了。
λ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
Readme.txt
nothing added to commit but untracked files present (use "git add" to track)
但是,如果你以为这就完了就太天真了。其实呢,这是噩梦的开始。因为你刚才的提交因为不区分大小写,会导致git上产生两个文件。
λ git ls-files
README.txt
Readme.txt
想一想也应该是这样,不区分大小写嘛,但在NTFS这种不区分大小写的系统中你让人如何pull代码?两个文件要合并么?
所以团队中最好还是不要开这个…那么这个咋整呢,其实也很简单,不妨继续回退到开始的状态,我们只是想解决给README.txt重命名为Readme.txt而已。
回到开始的状态:
λ git status
On branch master
nothing to commit, working tree clean
# 开始的状态,我只有一个README.txt文件
λ ls
README.txt
只要使用git mv的命令即可
λ git mv README.txt Readme.txt
C:\Users\Yanan\temp\temp7\temp7 (master)
λ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: README.txt -> Readme.txt
是不是检测到了重命名 😃
在Windows环境下,由于文件系统不区分大小写,导致Git在处理文件重命名时可能出现问题。Git默认配置为忽略大小写,这可能会在提交时创建两个看似相同的文件。通过修改`core.ignorecase`配置为`false`,可以使得Git区分大小写,但已有的提交历史中仍可能存在大小写不敏感的问题。解决方法是使用`git mv`命令进行重命名,以确保Git能正确检测到文件名的变化。

1万+

被折叠的 条评论
为什么被折叠?



