🐙

git で大文字子文字を区別する方法

2021/11/23に公開

概要

Git を使っていたときに、ファイル名がa.txtで管理していたものを、A.txtに変更してもファイル名が変更されたことを検知されない問題があったので調査しました。

解決策

公式ドキュメントにもあるとおり、core.ignorecasetrue だと大文字と小文字が区別されないらしい。

If true, this option enables various workarounds to enable Git to work better on filesystems that are not case sensitive, like FAT. For example, if a directory listing finds "makefile" when Git expects "Makefile", Git will assume it is really the same file, and continue to remember it as "Makefile".

The default is false, except git-clone[1] or git-init[1] will probe and set core.ignoreCase true if appropriate when the repository is created.

ですので、以下のコマンドでfalseにすると解決される。

git config --global core.ignorecase false

また、子文字を大文字に変更しただけだと、ディレクトリやファイルがローカルリポジトリから削除されても、リモートリポジトリ(GitHub)に残ってしまうときがあります(逆もしかり)。
そんなときには以下のコマンドでリモートリポジトリから削除できます。

git rm -r ファイル名

FAT とは

気になる一文として、FATのように大文字と子文字を区別しない...(略)がありました。
そこで FAT について調べてみました。

どうやら File Allocation テーブルの略で、MS-DOS のファイルシステムみたいです。
なぜ大文字と子文字を区別していないのかはわかりませんでしたが、可能性として開発当時のマシンスペックを考慮した軽量化のためかと考察しました。
それにしても、大文字と子文字を区別しないのは、UNIX ライクじゃないと思いました。

参考

https://git-scm.com/docs/git-config/2.14.6

https://git-scm.com/docs/git-init

https://stackoverflow.com/questions/52950/how-to-make-git-ignore-changes-in-case

https://ja.wikipedia.org/wiki/File_Allocation_Table#VFAT

Discussion