概要
- タイトルネタバレ
- 原因に気づくまでの僕の苦労をみて
きっかけ
ある日、私はあるリポジトリを git clone しました。
すると何もしていないのに git diff ができているではありませんか。 (私は VSCode 大好きなので commit されていない変更はすぐにわかります。VSCode は便利なので。)
何事かと思ってリモートリポジトリと見比べてみると、どうやらリモートリポジトリにはファイル名が同じで頭文字が大文字と小文字のものがあるようなのです。
そして自分のローカルにはそのファイルが一つしかありません。
調べてみると、 Windows や Mac では「ファイル名の大文字と小文字を区別しない」仕様があるようなのです。
つまり、git clone した瞬間に二つのファイルが同じファイルとして合体してしまい、それぞれ中身が違ったためにそれが変更だと認識されているようなのです。
やること
Windows であれこれやった話なので Windows の場合に限って話をします。 Windows には指定したディレクトリ内のファイルについて、ファイル名の大文字と小文字を区別する / しない を設定するコマンドがあるようです。
一応こんな感じです。
- 指定したディレクトリでファイル名の大文字小文字が区別する設定になっているかの確認
> fsutil.exe file queryCaseSensitiveInfo {PATH}
- 指定したディレクトリでファイル名の大文字小文字がの区別を有効にする
> fsutil.exe file SetCaseSensitiveInfo {PATH} enable
- 指定したディレクトリでファイル名の大文字小文字がの区別を無効にする
> fsutil.exe file SetCaseSensitiveInfo {PATH} disable
二つ目に書いたコマンドを実行すれば大文字と小文字を区別するようになってくれますので、後は適当にリモートリポジトリの方を見ながらコマンドプロンプトで消えてしまった方のファイルを作って中身をコピペするのが早いと思います。
正直もっと賢い方法もあると思いますがもう考えるのが面倒だったので。
補足
ちなみにですが、上述のコマンドを実行して大文字小文字の区別を有効にしても、エクスプローラーや VSCode 上ではうまく表示できないので、ファイルの作成はコマンドプロンプト上でやるのが吉です。
(エクスプローラーだと片方のファイルが作った瞬間に亜空間に消えたように見えて焦りますし、 VSCode だと有効になっているのに GUI だと重複して作成できないよ!と怒られてしまいます。)
問題点
このコマンドなんですが、指定したディレクトリをピンポイントでしか「有効/無効」の指定ができず、再帰的に適用するには PowerShell でシェル芸をしてやらないといけないっぽいです。 StackOverflow でそんな感じのやり取りを見た記憶があります。
しかも新規作成したディレクトリにデフォルトで適用するのも難しいみたいです。
つまり、「C ドライブ直下で再帰的に区別を有効にして完全にこの問題から解放される!」みたいなことはできないっぽいです。
ここら辺は Windows おじさんの出現を待つしかありません。
その他解決法
合体してしまったファイルたちと変更したいファイルが完全に無関係であれば、もうそこは無視してしまって特定のファイルだけをコミットする方法もあります。
$ git add {PATH}