How do I rename a file in git that differs by case only?

In my git (Xcode) project, I committed a filename with improper case. Now I went to try to rename it, but when I commit, I get:

fatal: Will not add file alias 'MyProject/MyFile.h' ('MyProject/MyFilE.h' already exists in index)

I'm sure this is because git isn't used to be running on a case-preserving, case-insensitive filesystem like HFS+. But how do I get around it?

I tried renaming both files to something else, and committed that, and then renaming them back to what I want, but it still fails (with the same error message).


Solution 1:

As asked and answered on stackoverflow, there's an easier way to do this that doesn't involve making a new file system in a disk image file:

Move your existing file aside, commit that move, then move it back using the case you'd like it to maintain and commit. Done.

Example:

mv foo foo2
git add -A
git commit -m "renaming"
mv foo2 FOO
git add -A
git commit --amend -m "renamed foo to FOO"

Solution 2:

I have not yet found a way to fix this directly on a case insensitive file system, you need a case sensitive filesystem.

Luckily Mac OS X has good virtual disk mounting support, so you can quickly & easily get (make) a (temporary) case sensitive filesystem on your computer.

Open up Disk Utility, make a New Image and set the "Format" field to one of the case-sensitive versions of "Mac OS Extended". Also make sure you make it big enough for your repository.

Mount your new disk, check out the git repository onto it, make sure the correctly named file has the correct contents, and delete the other one. Commit and push your changes, and then you can unmount the disk image and delete it.

If you don't have a remote server to clone from (i.e. you're just running a git repo locally on your hard drive), remember you can clone directly from the other git repository on your hard drive.