.gitignore ignore all files then recursively allow *.foo
git
Solution
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.
Problem
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