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 是大小寫敏感的。所以這樣的問題平時不易發現,本地調試的時候大部分時候並不會出錯誤,只有在項目部署的時候問題纔會顯示出來。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章