Когда вы говорите игнорировать *
, Git не будет возвращаться ни в какие подкаталоги (даже если у вас есть шаблон unignore, который может соответствовать чему-то внутри одного из каталогов).
Существует немного языка шаблонов gitignore , который может помочь. Конечный слеш заставляет шаблон применяться только к каталогам. Итак, вы должны быть в состоянии использовать это:
# .gitignore
*
!.keep
!*/
В приведенной ниже демонстрации я использую приведенный выше .gitignore
и у меня есть дополнительный файл (с именем do-not-keep
) рядом с каждым файлом .keep
. Вы можете видеть, что он работает для нескольких уровней подкаталогов и не показывает другие файлы. Вам нужно будет настроить, чтобы каждый каталог имел свой собственный .keep
(или любой другой) каким-либо независимым методом.
% git status --short -uall
?? a/.keep
?? a/b/.keep
?? a/b/c/.keep
?? a/b/c/d/.keep
?? e/.keep
?? e/f/.keep
?? e/f/g/.keep
?? h/.keep
?? h/i/.keep
?? j/.keep
Это было сделано с Git 1.7.3.1, но я ожидаю, что это будет работать и для других версий.
Демонстрационная установка:
% git init
% mkdir -p a/b/c/d e/f/g h/i j
% zargs -i.. -- **/*(/) -- touch ../.keep ../do-not-keep
% tree -aI .git .
.
|-- .gitignore
|-- a
| |-- .keep
| |-- b
| | |-- .keep
| | |-- c
| | | |-- .keep
| | | |-- d
| | | | |-- .keep
| | | | `-- do-not-keep
| | | `-- do-not-keep
| | `-- do-not-keep
| `-- do-not-keep
|-- e
| |-- .keep
| |-- do-not-keep
| `-- f
| |-- .keep
| |-- do-not-keep
| `-- g
| |-- .keep
| `-- do-not-keep
|-- h
| |-- .keep
| |-- do-not-keep
| `-- i
| |-- .keep
| `-- do-not-keep
`-- j
|-- .keep
`-- do-not-keep
10 directories, 21 files