Case-sensitive git in Mac OS X like a Pro
Found an awesome GIT tip for OSX users which are having problems with case-sensitivity and renaming of files. The issue occurs when you use the default OS X disk format (case-preserving, but not case-sensitive) and try to rename a file or folder in git by changing letters to uppercase/lowercase.
A typical hack around the issue is to execute multiple commands:
git mv filename filename_tmp
git mv filename_tmp Filename
git commit -m "Set correct case for filename"
gives no guarantee that it won't f*ck up any other users checkout which most likely need to remove the file or checkout a clean copy of the git repo.
However this approach caused me major headaches when I was doing a pull-request and had to squash my commits before pushing it (and one commit included the case changes to filenames). I did not find a good way to fix this problem. Also, other people in your team will not get the filename changes you just comitted on a git pull
. So, a new approach to the solution!
Enter the world of read-write disk image using Disk Utility and use this newly created volume as your base working directory for working with git-repos! If all OS X users in your oragnization/company uses this approach, you should be good!
Here's what you do:
- Launch Disk Utility
- Choose "New Image"
- Enter a nice Name for your Volume, e.g "Workspace"
- Set the size to something that will most likely fit your needs (resizing is a whole another story)
- Select "Mac OS Extended (Case-sensitive, Journaled)" in "Format".
- Select "Single Partition - Apple Partition Map" in "Partitions"
- Ensure "sparse bundle disk image" is set in "Image Format".
- Save it somewhere on your hard drive
Now, when you mount this disk image you can move all your git repos over to this Volume to enjoy a git that doesn't get confused by those pesky case-changes!
(PS: You can choose to add the Disk Image created to your Login Items in the OS X System Preferences to have it automatically mount on boot)
Update: My new favorite way of dealing with this is to buy a Nifty MiniDrive microSD card adapter that allows you to always have with you an extra harddrive without anything "sticking out" of your macbook. With this option I always carry a extra 64 GB drive volume formatted as Mac OS Extended (Case-sensitive, Journaled) which I use for my git projects.
Related protips:
Written by Even André Fiskvik
Related protips
12 Responses
@SaberUK That's also an option, that's why I recommended creating an Disk Image, not formatting your main drive :)
If you make two commits, then other users will also be fine.
You can use:
git mv --force filename Filename
git commit -m "Set correct case for filename"
and a git pull
for this change would also rename the file for other OS X users.
Hi there,
well done. made my day for a symfony project.
Thanks !
Wisebes
This is amazing! Thank you for this!
If you work with unix in any way and work on a mac highly recommended!
We have issues in certain programs because they don't see file changes automatically.
Any idea how to fix this?
You need to issue a "git config core.ignorecase false" if your Git repository is configured to ignore case in filenames. Otherwise the commit will break with "fatal: Will not add file alias 'Filename' ('filename' already exists in index)"
awesome. thanks for the tip!
Be careful with the double-commit and ignoring cases here.
Linux kernel sources contain files that have both all-caps and small-caps versions.
Using what double commit or ignore cases will mess up your/kernel code.
check those out:
modified: include/uapi/linux/netfilter/xtCONNMARK.h
modified: include/uapi/linux/netfilter/xtDSCP.h
modified: include/uapi/linux/netfilter/xtMARK.h
modified: include/uapi/linux/netfilter/xtRATEEST.h
modified: include/uapi/linux/netfilter/xtTCPMSS.h
modified: include/uapi/linux/netfilteripv4/iptECN.h
modified: include/uapi/linux/netfilteripv4/iptTTL.h
modified: include/uapi/linux/netfilteripv6/ip6tHL.h
modified: net/netfilter/xtDSCP.c
modified: net/netfilter/xtHL.c
modified: net/netfilter/xtRATEEST.c
modified: net/netfilter/xt_TCPMSS.c
@BobbyMarinov if you actually read the tip, it's not about using double-commiting at all and explains some of the troubles with it...
You never had any problem with the SD card strategy? Because I tried to work permanently on a SD card on my mac and each time after I closed the lid weird "disconnection" happened with the files I was working on.
Using the "sparse bundle disk image" I was unable to open my workspace in VSCode. After converting the volume to read/write I was able to open the volume as expected. Personally, I wouldn't recommend this approach for any more than the occasional troublesome repo as, working across systems, it's seldom I encounter this issue. YMMV.