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.