Try a .gitignore like this:
dir2/*
!dir2/*.derp
Per gitignore man page: http://www.kernel.org/pub/software/scm/git/docs/gitignore.html
If the pattern ends with a slash, it is removed for the purpose of the following description, but it would only find a match with a directory. In other words, foo/ will match a directory foo and paths underneath it, but will not match a regular file or a symbolic link foo (this is consistent with the way how pathspec works in general in git).
I suspect it's ignoring all files in that directory and not getting to the point where it would check using !.