Как я могу написать правило в gitignore, чтобы игнорировать все файлы, кроме каталогов в некотором каталоге? - PullRequest
7 голосов
/ 06 октября 2010

Допустим, у меня есть структура каталогов, такая как

uploads/
--dir1/
----one.txt
----two.txt
----dir2/
------one.txt
------two.txt

Я бы хотел, чтобы отслеживались все каталоги и подкаталоги загрузок, но не файлы в нем, за исключением фиктивного файла, поскольку git не отслеживает каталоги.

Я думаю, что-то вроде этого будет работать, но это не так.

*
!.gitignore

1 Ответ

8 голосов
/ 07 октября 2010

Когда вы говорите игнорировать *, 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
...