gitignore todo, excepto el subdirectory repetido

Tengo la siguiente estructura de directory:

./ ├── proj-1 │ ├── README.md │  ├── src/ │  └── test/ └── proj-2 ├── README.md ├── src/ └── test/ 

¿Cómo puedo ignorar todo excepto los src/ directorys usando solo un file .gitignore en el directory raíz?

He intentado:

 * !.gitignore !/*/src/ !/*/src/* 

Pero eso no parece recoger los directorys que quiero después de ejecutar el git status .

¿Algun consejo?

Debe ignorar recursivamente todos los directorys principales del tree de directorys src y luego ignorar su contenido:

 # Ignore everything * # Unignore .gitignore !.gitignore # Unignore all directories !*/ # Ignore contents of all directories */* # Unignore all src subdirectories !*/src/ # Unignore directory tree under src subdirectories !*/src/** 

Entonces, para un tree que se parece

 . ├── proj-1 │  ├── README.md │  ├── src │  │  ├── srcfile1 │  │  ├── srcfile2 │  │  ├── srcfile3 │  │  └── subsrc │  │  ├── subsrcfile1 │  │  ├── subsrcfile2 │  │  └── subsrcfile3 │  └── test │  ├── testfile1 │  ├── testfile2 │  └── testfile3 ├── proj-2 │  ├── README.md │  ├── src │  │  ├── srcfile1 │  │  ├── srcfile2 │  │  └── srcfile3 │  └── test │  ├── testfile1 │  ├── testfile2 │  └── testfile3 └── proj-3 └── file 

obtienes este estado

 On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) .gitignore proj-1/ proj-2/ nothing added to commit but untracked files present (use "git add" to track) 

y después de agregar todo, obtienes

 $ git add * .gitignore $ git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: .gitignore new file: proj-1/src/srcfile1 new file: proj-1/src/srcfile2 new file: proj-1/src/srcfile3 new file: proj-1/src/subsrc/subsrcfile1 new file: proj-1/src/subsrc/subsrcfile2 new file: proj-1/src/subsrc/subsrcfile3 new file: proj-2/src/srcfile1 new file: proj-2/src/srcfile2 new file: proj-2/src/srcfile3 

.gitignore tiene que agregarse explícitamente porque el shell no se expande * para include files ocultos.