😥

フォルダ/ファイル名の大文字小文字でハマった

2022/07/29に公開

フォルダ/ファイル名の大文字小文字で少しハマったのでメモ

実施環境
項目 詳細
PC MacBook Pro(14 インチ、2021)Apple M1 Pro
OS MacOS Monterey 12.5

なにに困ったのか

ファイルの大文字小文字を変えたのに差分として認識されなかった

調べてわかった前提

git は(デフォルトでは)大文字/小文字を区別しない

git config の core.ignorecase がデフォルトで true のため、何もしなければ無視するようです。
そのため、大文字小文字を変更しても、差分としては検知してくれません。そのためコミットもできません。
git config core.ignorecase false で区別するようになります。

mac はフォルダ/ファイルの大文字/小文字を区別しない

らしいです。知らなかった。
https://dev.classmethod.jp/articles/mac-apfs-ignore-case/

github は大文字/小文字を区別している

ぽいです。
そのため、何が起こるかというと、例えば

  • A さんが/Case/index.js(大文字)を push
  • B さんが/case/index2.js(小文字)を push

みたいな状態になった時に、github 上ではそれぞれ別のフォルダとして認識されます。

しかし mac では区別しないため、ローカルで pull すると同じフォルダとして扱われます。

そうなると、例えば別ファイルでimport * from '/Case/index2.js' 的なことをした時に、ローカルでは問題なくビルドできるが、github 上では/case/index2.jsになっているためビルドでコケるみたいなことが起こります。

対処法

直接ファイル名、フォルダ名をいじっても github に push できません。

git mv

例えば上記の例でいうと、git mv /case/index2.js /Case/index2.js とすれば git にも認識されて、コミットできます。

core.ignorecase

git mv だけでも問題ないですが、先程もでてきたgit config core.ignorecase falseしておくと今後認識されるようになるので github とローカルを見比べるみたいなことをしなくていいかもしれません。

git ls-files

git ls-filesをすると、git がファイルをどのように認識しているかが確認できます。git mv した時にfatal: not under version control等のエラーが出ることがあるので、git がファイルをどのように認識しているか確認するのに使いました。

まとめ

よくわからんけど git mv 使わなきゃいけないみたいなおぼろげな認識しかなかったので、整理できてよかったです。

参考にさせていただいた記事

https://dev.classmethod.jp/articles/mac-apfs-ignore-case/
https://zenn.dev/emono/articles/fb78313ee5f6a2
https://git-scm.com/docs/git-ls-files

Discussion