1. 程式人生 > >git 大小寫問題 踩坑筆記

git 大小寫問題 踩坑筆記

關於 git 大小寫問題的解決辦法

寫在前面:

最近,在專案部署的時候,總是遇到一些很靈異的問題,比如在 merge 沒有報錯的情況下,檔案沒有更新, 特殊的檔案突然被還原至之前的某個版本……最後發現問題所在,是之前的一次 檔名大小寫 引起的問題。解決過程其實還是挺糟心的(自己埋的坑要自己填……),深刻體會到好的規範比好的技術其實更重要。同時也覺得,有必要記錄一下,謹防下次掉進去。

問題復現:

  1. 新建一個 a.js 檔案(大小寫不敏感的狀態下),並提交
  2. 修改本地 a.js 變為 A.js,檔案內容無變更,無法提交
  3. 執行git config core.ignorecase false
    ,修改 大小寫敏感 規則,然後提交,檢視結果,此時會存在 大小寫 同時存在的檔案
  4. 此時某種機緣下,再次執行 git config core.ignorecase true,大小寫不敏感,
  5. 此時執行 git push , 即把最新的更新都更新到了 a.js
  6. 此時再修改 大小寫敏感規則為敏感, 執行 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 是大小寫敏感的。所以這樣的問題平時不易發現,本地除錯的時候大部分時候並不會出錯誤,只有在專案部署的時候問題才會顯示出來。

至此,終於填了一個不該踩的坑。