關於 Git 的檔案名稱大小寫問題與修正

前言

滿多人都會被 Git 的一個雷點給雷到,也就是檔案名稱大小寫不敏感的問題,所以這一篇我特別寫一篇來紀錄與分享怎麼解決這個問題。

檔案名稱問題

首先我們先嘗試觸發這個問題,這樣子才會比較印象深刻,我們先建立一個資料夾與檔案

1
2
3
mkdir test
cd test
touch readme.md

接下來我們先把這個資料夾加入 Git 並且傳到遠端儲存庫 GitHub 上

1
2
3
4
git init
git add .
git commit -m "init"
git push origin main

此時你的遠端儲存庫應該是這樣

GitHub

接著我們要來做什麼事?我們要把檔案名稱改成 README.md

1
mv readme.md README.md

接著你再輸入 git status 你會看到以下訊息

1
2
3
4
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

這時候你再輸入 git add . 你會發現 Git 一點反應也沒有,為什麼會這樣呢?因為預設狀況下 Git 認為 readme.md 與 README.md 是同一個檔案,所以 Git 會視為沒有任何變更,因此 Git 會忽略這個變更。

解決方法

這邊我會列出兩種方式,一種其實比較偏向 Git 的設定,另一種則是比較偏向於 Git 的操作。

Git 設定

首先 Git 有提供一個指令可以去設定檔案名稱大小寫敏感,這個指令就是 git config core.ignorecase,這個指令可以讓 Git 認為大小寫不同的檔案是不同的檔案,所以 Git 會正常的去偵測檔案的變更,而預設情況下 Git 是會忽略大小寫的。

因此我們先將剛剛改成 README.md 的檔案改回來

1
mv README.md readme.md

接著輸入 git config core.ignorecase false

1
git config --local core.ignorecase false

雖然也有 Global 設定可以使用,但是這必須額外去設定一個 Global 的 Git 設定檔,而且這個設定檔會影響到你輸入 git init 以及所有的 Git 專案,所以個人會建議使用 Local 設定就好,這樣子只會影響到當前這個專案。

另外,如果你針對你的本地專案設定了 git config --local core.ignorecase false,那麼當你推到遠端儲存庫時,你的遠端儲存庫也會跟著變成 git config --local core.ignorecase false,這樣子你 git clone 時就不用再去設定一次了。

先來講講 truefalse差異

  • true:Git 會忽略大小寫
    • readme.mdREADME.md 是同一個檔案
  • false:Git 會認為大小寫不同的檔案是不同的檔案
    • readme.mdREADME.md 是不同的檔案

如果你在專案底下單純輸入 git config core.ignorecase,是可以看到當前專案的設定

接著我們來更改檔案名稱,這邊示範使用 mv 的方式

1
mv -f readme.md README.md

接著我們再輸入 git status 你會看到以下訊息

1
2
3
4
5
6
7
8
On branch main
Your branch is up to date with 'origin/main'.

Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md

nothing added to commit but untracked files present (use "git add" to track)

Git

這樣子 Git 才能夠正常偵測到檔案名稱的變更,這時候你才有辦法輸入 git add.git commit … 等指令唷。

請注意「Git 設定」必須在專案初始化時就設定,否則你有很高機會遇到一些雷點,例如上傳到 GitHub 後結果出現同名的兩個檔案,如:

  • README.md
  • readme.md

所以請記得在專案初始化時就設定好 Git 設定,這樣子才能夠避免一些雷點。

Git 操作

其實 Git 也有提供一個指令可以讓你去更改檔案名稱,這個指令就是 git mv,這個指令可以讓你更改檔案名稱,並且 Git 也會正常的去偵測檔案的變更,而這個方式最簡單的也是最推薦的,使用方式就是 git mv <舊檔案名稱> <新檔案名稱>

因此你可以試著輸入以下指令

1
git mv -f readme.md README.md

git mv 其實可以用於搬移檔案、重新命名,而加上 -f 代表強制執行的意思。

接著再輸入 git status 你會看到以下訊息

1
2
3
4
5
6
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: readme.md -> README.md

你會發現與前面的方式不同,上面的提示訊息是顯示 renamed,而使用 mv 的方式則使會提示以下

1
2
3
4
5
6
7
8
On branch main
Your branch is up to date with 'origin/main'.

Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md

nothing added to commit but untracked files present (use "git add" to track)

這兩者的差異是非常大的,如果是 Untracked files 就代表其實你是新增一個檔案,那麼這種狀況下是有很高機率會導致重複的檔案被上傳到遠端儲存庫,例如同時出現 readme.md 與 README.md。

因此使用 Git 指令來操作是較為妥當的,所以不管怎麼樣,只要你想更改檔案名稱,都應該使用 git mv 這個指令會比較好。

結論

其實我沒想到我在寫這一篇的同時也被雷到,因為我一直習慣用 mv 來更改名字,結果一直想說是不是哪邊怪怪的,寫到一半才想到應該要使用 git mv -f 才對,所以這一篇也剛剛好幫我複習了一下雷點。

Liker 讚賞

這篇文章如果對你有幫助,你可以花 30 秒登入 LikeCoin 並點擊下方拍手按鈕(最多五下)免費支持與牡蠣鼓勵我。
或者你可以也可以請我「喝一杯咖啡(Donate)」。

Buy Me A Coffee Buy Me A Coffee

Google AD

撰寫一篇文章其實真的很花時間,如果你願意「關閉 Adblock (廣告阻擋器)」來支持我的話,我會非常感謝你 ヽ(・∀・)ノ