好吧,在开发中遇到一个问题:
ide直接修改文件名的大小写,但是git忽略文件名大小写的解决办法
我在Android Studio通过ide的修改文件名功能将一个”helloworld.java”的文件改名为”HelloWorld.java”。但是每次从git服务器上clone的时候,发现文件名又还原成了”helloworld.java”。导致项目报错。
每次手动修复只是治标,没有治本。
重现问题:
1.先创建一个TestGitIgnorecase,然后在里面创建一个helloworld.java。然后commit到本地仓库。
2.通过android studio的refactor里的rename选项将helloworld.java改名为HelloWorld.java。然后share到github上。
3.再从github上clone到本地,然后你会发现你clone的项目中,文件名依旧是helloworld.java。
更简单的重现:
假设hello.txt已经提交到仓库了,然后执行下面的操作:
$mv hello.txt Hello.txt
$git status
On branch master
nothing to commit, working directory clean
够奇怪了吧!
问题的分析:
从上面的问题,可以看到,git貌似是忽略了文件名的大小写的。也就是说,它认为两个是一样的。
git config中有个core.ignorecase设置,用来设置是否忽略大小写。
git分为本地和服务器,git本地是win系统,而服务器是linux。
先在本地查询core.ignorecase配置:
>git config –get core.ignorecase
true
或者查git的全局设置:
>git config –global –get core.ignorecase
再去服务器查询:
$git config –get core.ignorecase
没有返回结果
已知的大小写不敏感的系统
- windows
- osx
比如在mac下,可以查看当前文件系统是否支持大小写敏感:
$diskutil info /
显示:
File System Personality: Journaled HFS+
Type (Bundle): hfs
Name (User Visible): Mac OS Extended (Journaled)
如果看到“Case-sensitive Journaled HFS ”,说明是支持大小写敏感的。
或者是:
$touch ab1
$touch aB1
$ls a*
如果显示1个文件,则说明是不支持大小写敏感
如果显示2个文件,则说明是支持大小写敏感的
尝试解决办法:
方法一:
在本地仓库中,执行
git mv helloworld.java Temp.java
git mv Temp.java HelloWorld.java
然后提交此次更改,提示:
Commit failed with error:
Will not add file alias ‘app/src/main/java/info/dabu/testgitignorecase/HelloWorld.java’ (‘app/src/main/java/info/dabu/testgitignorecase/helloworld.java’ already exists in index)
结果:失败了
方法二:
本地将HelloWorld.java拷贝到其他地方,然后执行:
>git rm -f HelloWorld.java
删除成功后,再将这个HelloWorld.java拷贝会原来的目录,在将这个文件commit和push到github上。
结果:问题解决
方法三:
修改本地仓库的git config中的core.ignorecase设置。win下这个设置貌似默认是true。我们将其改为false。可以去config文件修改也可以直接命令修改
>git config core.ignorecase false
设置git全局的core.ignorecase:
>git config –global core.ignorecase false
建议
通过上面的实例,我的建议就是别用系统的(ide也是使用系统的)的改名功能。而应该使用git mv来修改文件名。或者是将git config的core.ignorecase设置为false。