好吧,在开发中遇到一个问题:

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。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.