🔠

git で同名ファイルの大文字/小文字を変更した後のチェックアウトでエラーになる

に公開

前提

ローカルの OS は Windows/MacOS とする。
大文字/小文字を区別させるために git config core.ignorecase false の設定がされているものとする。

同名だが大文字/小文字が異なるファイルが存在する branch 同士の checkout

例えば、readme.md というファイルを README.MD に変更して別のブランチに commit してあるとする。

このとき、大文字の branch-2 から、小文字の branch-1 に切り替えようとすると、以下のようなエラーが出てしまう。

error: The following untracked working tree files would be overwritten by checkout:
        readme.md
Please move or remove them before you switch branches.
Aborting

解決方法

-f のオプションをつける。

git checkout -f branch-1

大文字/小文字変更を merge されたブランチの pull

github 上や、他者が branch-1 に branch-2 を取り込み、リモート上の最新の branch-1 も大文字になっているとする。
この時に pull を実行すると今度は以下のようなエラーがでる。

error: The following untracked working tree files would be overwritten by merge:
        README.MD
Please move or remove them before you merge.
Aborting

解決方法

小文字のファイルを rm したのち pull する

git rm readme.md

なぜ?

Windows や MacOS はファイル名の大文字と小文字は同じ文字として扱うような仕様になっている (ABC == abc == Abc == aBC = ...)。
git config core.ignorecase false を設定してあるために、git としては区別しているが、OSとしては同名のファイルなのでうまく処理ができない。
なお Linux 等では区別するので、この問題は発生しない。

その他

git はデフォルトだと git config core.ignorecase true の状態になっている。
そのままの状態(かつ Windows/MacOS)で、 readme.mdREADME.MD に変更したとしても同名ファイルと認識されたままなので、ファイル名の変更は commit に反映されない。

Discussion