xcodeでGitを利用している場合のファイル名のリネームの問題

MacxcodeでGitを利用している場合は、ファイルやプロジェクトの名前変更を行う時に気をつけておかなければならないことがある。

Git(及びxcode?)では、ファイル名の大文字及び小文字を区別するが、Mac上ではファイル名の大文字と小文字を区別しない。

どういうことかというと、次の場合のリネームが問題になる。

xcode上のファイル(xcodeで表示されているファイル名)

  • hogeFile.m

  • hogeFile.h

Mac上で実際に生成されるファイル(finderで確認できるファイル名)

  • hogeFile.m

  • hogeFile.h

Gitで管理されているファイル(git ls-filesで表示されるファイル名)

  • hogeFile.m

  • hogeFile.h

この時、xcode上で以下のように、hogeFile.mをHogeFile.mに変更する。

20140702215215

xcode上のファイル(xcodeで表示されているファイル名)

  • HogeFile.m

  • hogeFile.h

Mac上で実際に生成されるファイル(finderで確認できるファイル名)

  • HogeFile.m

  • hogeFile.h

Gitで管理されているファイル(git ls-filesで表示されるファイル名)

  • HogeFile.m

  • hogeFile.m

ファイル名が正しく変更されているように見えるが、xcode上からcommitしようとすると、既にhogeFile.mが存在すると言われてcommitできない。

20140702215216

xcodeから、ファイル名を同じようにHogeFile.mをhogeFile.mに戻し、

xcode上でcommitしようとすると何故かHogeFile.mがcommit対象になっている。

20140702215217

terminalからgit statusで確認しても、commitすべきファイルがないよと言われる。

ただ、これはxcodeを再起動すれば、commitは正常に戻るので安心して良い。

結局どうやって大文字小文字のリネームをすれば良いか

xcode, Git, Macでどうファイル名を処理しているか把握していないので、正しい方法は不明だが以下の手順に従えばおそらく大丈夫だろう。

hogeFile.mからHogeFile.mに変更する場合を記す。

  1. hogeFile.mxcode上からhogeFilehogehogehoge.mに変更する。

  2. 一度xcode上からcommitする。

  3. xcodeを再起動する。

  4. xcode上からhogeFilehogehogehoge.mHogeFile.mに変更する。

  5. もう一度commitする。

  6. xcodeを再起動する。

勿論、hogeFilehogehogehoge.mは既存のファイルと違う名前なら何でも良い。

上記の手順でなくても、上手くいく場合がある。xcodeのcommitの挙動がおかしければ再起動すれば、何とかなるなる場合が多い。

補足

xcodeのファイル名及びプロジェクト名の変更はRefactorという機能を使っても変更が可能である。しかし、この機能を使ってもファイル名の大文字小文字の問題は起こる。

また、Refactorの機能でリネームする場合も上記の手順に従えば問題なくリネームできると思う。ただ、Gitで管理するファイルにxcodeの設定ファイルを含めないようにしていると場合によっては上手く行かない場合もあるので注意が必要。