Un-Ignoring Files and Directories in Git
I had a nasty little problem the other day, and I couldn't figure it out until I really started googling the problem and saw that the solution was (of all places) in the man pages. Here's the set-up for the problem.
I have a git repo and at the top level it looks like this:
Makefile README bin/ doc/ java/ lib/ logs/ src/ tests/
and because the lib directory contains nothing by generated files (the so libraries), it makes sense to have a top-level .gitignore file looking like this:
*.swp *.swo *.tgz lib logs __dist core.*
But then when we look at the next level, we see that things get complicated:
Makefile README bin/ doc/ java/ Makefile build.xml classes/ dist/ lib/ peak6/ tests/ lib/ logs/ src/ tests/
And in the java/lib/ directory we have third-party jars that we want included in the repo. The problem is, git looks at the top-level .gitignore and sees the line with lib in it, and therefore, the lib in the java directory is also ignored.
But there's a fix. Un-ignore the java/lib. How to do that?
Make the .gitignore fine in the java directory look like this:
classes dist !lib *.classes *.swp *.swo
and it's the inclusion of the !lib line that's telling git "Hey, don't ignore this guy".
The more I use git the more impressed I am with it. Subversion made me copy the files to ignore to each directory, git is nicer with the directory structure providing the inheritance, and with this, I can now be as selective as I need. Sweet.