.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

  • How to use libgit2sharp with ssh-transport-protocol?
  • Git Bash & Pageant not using keys
  • Is there anything for subversion as gerrit for git?
  • Untrack folder locally in git and push to production without deleting
  • git pull all branches from remote repository
  • Git vs Team Foundation Server
  • (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

  • git-stash changes without reverting
  • Not able to run bower.json file - from NPM command
  • Adapting the git-flow model for pre-production environments
  • bugfixing while developing with git
  • How to have git treat tar archives transparently as directories?
  • PHP exec('git') failing
  • One Solution collect form web for “.gitignore ignore all files then recursively allow *.foo”

    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.

    Git Baby is a git and github fan, let's start git clone.