Что делает! */Означает в .gitignore

С git версией 1.7.1 я пытаюсь исключить все файлы, кроме файлов .php.

Рабочее решение, которое я нашел, опирается на команду !*/

# Ignore Everything
*

# Except these files
!.gitignore
!*/
!*.php

Без !*/ он будет включать только файлы *.php в корневой каталог. Что такое !*/, что позволяет это работать?

Ответ 1

Взгляните на документацию о gitignore

Дополнительный префикс "!" что отрицает шаблон; любой соответствующий файл исключенный предыдущим шаблоном, снова включается. Это не можно повторно включить файл, если родительский каталог этого файла Исключенный. Git не отображает исключенные каталоги для производительности причины, поэтому любые шаблоны на содержащихся файлах не имеют никакого эффекта, независимо от того, где они определены. Поместите обратную косую черту ( "\" ) перед первой "!" для шаблонов, которые начинаются с буквального "!" , например, "! Важно!.txt".

Ответ 2

Вот моя линия мышления:

Оператор ignore * будет игнорировать все по умолчанию, , включая корневой каталог и все его содержимое.

Итак, в этот момент все файлы и папки в корневом каталоге игнорируются.

Команда !*.php будет повторно включать все файлы *.php в корневой путь, но папки все еще игнорируются (потому что они не заканчиваются на .php) - и, следовательно, они не являются с отрицанием от gitignore.

Таким образом, команда !*/ повторно включает все каталоги (и последующие подкаталоги), чтобы их можно было исследовать для файлов *.php. Пример: folder1/ соответствует оператору отрицания !*/, потому что он содержит / в конце, а имя папки вставляется в подстановочный оператор *