Since Git 2.7.0 Git will take exceptions into account. From the official release notes:
- Allow a later "!/abc/def" to override an earlier "/abc" that appears in the same .gitignore file to make it easier to express "everything in /abc directory is ignored, except for ...".
https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.7.0.txt
edit: apparently this doesn't work any more since Git 2.8.0