Когда вы игнорируете все (*
), вы игнорируете папки, даже если они тоже имеют содержимое, так как *
соответствует всему.
Если вы игнорируете что-то, это будет соответствовать только для файлов корневого каталога.Если вам нужно игнорировать каталог, вам нужно явно сказать это (то есть !mydir/
).Но это приведет к игнорированию всего содержимого этого каталога, поэтому вам придется переопределить шаблон игнорирования / игнорирования содержимого этого каталога.Даже если вы сделаете это, если вы еще не добавили dir в индекс, вы не увидите этого в git status
.
Ваш случай может быть легко решен, но инвертированный шаблон.
В основном вы хотите игнорировать все, что
- не начинается с
es
, а - не заканчивается
.h
или .m
.
Сделайте так:
$ ls -a
. .. .git .gitignore a b blah c ebar.m esfoo.h esfoo.m sbar.m
$ ls -a blah/
. .. a b c ebar.m esfoo.h esfoo.m sbar.m
$ git status -s
?? blah/
?? esfoo.h
?? esfoo.m
$ git status -s blah/ # matching files ignored and also ignored on `git add`
?? blah/esfoo.h
?? blah/esfoo.m
$ git add .
$ git status -s # only wanted files were added
A blah/esfoo.h
A blah/esfoo.m
A esfoo.h
A esfoo.m
$ cat .gitignore # the ignore pattern -- ignore
[^e]* # everything that doesn't start with 'e'
e[^s]* # and is not followed by an 's'
*.[^hm] # and does not end with '.h' or '.m'
!/blah # uningore the wanted subdirs
Как вы видите в последней команде, я инвертировал ваш шаблон, чтобы игнорировать все, что не начинается с e
ине сопровождается s
, и это не заканчивается .h
или .m
, а также игнорирует dir.Несмотря на то, что каталог имел больше содержимого, он игнорировался, поскольку соответствовал шаблону, и добавлялись только нужные части.
edit : обновлено