.gitignore ignore all files then recursively allow *.foo

There's already several questions similar to this, but none of the answers work for me.

I want to ignore everything in the folders below my repository except files with *.foo

(If anyone is wondering how this can be justified - I'm actually making a git repository for all my "Logic" projects - music software on the mac - but I only want to store the actual project files *.logic)

I'm going to spell it out, so we're all on the same plate. Here's what I do, starting from scratch:

Setup:

mkdir temp
cd temp
mkdir testdir
cd testdir
touch include.foo
touch dontinclude.bad
cd..
git init
touch .gitignore

Paste this in to .gitignore

# Ignore all
/*

# But not these files...
!.gitignore
!*.foo

git status

And the only untracked file is .gitignore

if I typed 'git add .' - no change, only .gitignore is seen and my 2 files are ignored.

Why doesn't this work and how can you change the procedure above to make it work?

Here's the extremely similar question where I got the .gitignore file from. I'm using git --version 1.7.7 (also tried 1.7.3) - .gitignore to ignore all files, then recursively allows files of a certain type


Your problem is that the /* pattern at the beginning is matching all files and directories at the top level - including testdir, so everything inside testdir is ignored.

This is what you want:

# Ignore everything
*
# Don't ignore directories, so we can recurse into them
!*/
# Don't ignore .gitignore and *.foo files
!.gitignore
!*.foo

When you do a git add . with this config, you should find you have only .gitignore and *.foo files listed as changes to be committed.