關於 git 大小寫問題的解決辦法
寫在前面:
最近,在項目部署的時候,總是遇到一些很靈異的問題,比如在 merge 沒有報錯的情況下,文件沒有更新, 特殊的文件突然被還原至之前的某個版本……最後發現問題所在,是之前的一次 文件名大小寫 引起的問題。解決過程其實還是挺糟心的(自己埋的坑要自己填……),深刻體會到好的規範比好的技術其實更重要。同時也覺得,有必要記錄一下,謹防下次掉進去。
問題復現:
- 新建一個 a.js 文件(大小寫不敏感的狀態下),並提交
- 修改本地 a.js 變爲 A.js,文件內容無變更,無法提交
- 執行
git config core.ignorecase false
,修改 大小寫敏感 規則,然後提交,查看結果,此時會存在 大小寫 同時存在的文件 - 此時某種機緣下,再次執行
git config core.ignorecase true
,大小寫不敏感, - 此時執行
git push
, 即把最新的更新都更新到了 a.js 中 - 此時再修改 大小寫敏感規則爲敏感, 執行
git pull
,並不會拿到最新的更新。比如自己想要的是第一次修改後的 A.js ,但是服務器有一個沒有更新的 A.js 和 有更新的 a.js,而你只能拿到前者,所以就會遇到各種各樣的坑……
解決辦法:
執行git config --global core.ignorecase false
,全局設置 大小寫敏感 。
1. 文件變更比較少的情況
直接使用以下命令重命名文件,在 git 中不要直接修改文件名,最好的辦法是使用下面的方式,
git mv -f [你想要刪掉的文件] [你想要留下的文件]
git mv -f a.js A.js
等同於:
git rm a.js
git add A.js
這個命令的目的就是刪除不需要的大小寫同名文件,修改後 git push
提交變更即可。
tips:
因爲 git 默認大小寫不敏感,所以最好添加項目配置文件,設置 大小寫敏感。
touch .gitconfig
git config core.ignorecase false
2. 變更比較多,並且擁有分支較高權限
- 在 github 刪除該分支
- 本地執行
git rm -r --cached
. (注意後面‘點號’) - 然後重新
git push
,就ok了
此法不太好,有點暴力,容易出問題,但適用於 變更發生於近期的情況。
總結:
其實看解決辦法的話,只是一個很小的問題,但是出現的 bug 確實是讓人很頭疼的,因爲 mac windows 在不設置大小寫敏感規則的時候默認大小寫是不敏感,項目部署的機器是 Linux 的,而 Linux 是大小寫敏感的。所以這樣的問題平時不易發現,本地調試的時候大部分時候並不會出錯誤,只有在項目部署的時候問題纔會顯示出來。
至此,終於填了一個不該踩的坑。