git 大小寫問題 踩坑筆記
阿新 • • 發佈:2019-02-19
關於 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 是大小寫敏感的。所以這樣的問題平時不易發現,本地除錯的時候大部分時候並不會出錯誤,只有在專案部署的時候問題才會顯示出來。
至此,終於填了一個不該踩的坑。