Разница между ** и * в сопоставлении glob (.gitignore)

У меня есть следующая структура и файлы каталогов.

pw-spec/
|-- event_spec.coffee
|-- event_spec.js
|-- integration
|   `-- service
|       |-- auth_spec.coffee
|       |-- auth_spec.js
|       |-- chat_spec.coffee
|       |-- chat_spec.js
|       |-- transport_spec.coffee
|       `-- transport_spec.js
|-- message_spec.coffee
|-- message_spec.js
|-- pw_spec.coffee
|-- pw_spec.js
|-- run.coffee
|-- run.html
|-- run.js
|-- service
|   |-- auth_spec.coffee
|   |-- auth_spec.js
|   |-- chat_spec.coffee
|   |-- chat_spec.js
|   |-- stream_spec.coffee
|   `-- stream_spec.js
|-- spec.coffee
|-- spec.js
`-- stub
    |-- stream.coffee
    |-- stream.js
    |-- transport.coffee
    `-- transport.js

4 directories, 27 files

Я хотел бы игнорировать все файлы *.js в любом месте каталога pw-spec.

Однако добавление следующих шаблонов в .gitignore не сокращает его:

pw-spec/*.js
pw-spec/**/*.js

Проблема заключается в том, что вторая соответствует только js файлам, которые имеют ровно 1 уровень глубоко внутри дерева, в то время как я хочу сопоставить все js файлы в pw-spec.

Выполнение

ls pw-spec/**/*.js

создает [1]:

pw-spec/service/auth_spec.js
pw-spec/service/chat_spec.js
pw-spec/service/stream_spec.js
pw-spec/stub/stream.js
pw-spec/stub/transport.js

Как вы можете видеть

pw-spec/integration/service/auth_spec.js
pw-spec/integration/service/chat_spec.js
pw-spec/integration/service/transport_spec.js

отсутствуют в [1].

Ответы

Ответ 2

В зависимости от ваших потребностей существует два подхода для такого типа ситуаций.

Одним из решений является установка

# generated files
*.js

в pw-spec/ .gitignore.

Второе решение - поставить:

/pw-spec/*.js
/pw-spec/*/*.js
/pw-spec/*/*/*.js

и т.д. в основном файле .gitignore. Этот подход является хрупким, если добавлено больше подкаталогов.

Обычно я предпочитаю помещать файл .gitignore на тот же уровень, что и Makefile, который генерирует файлы, которые я игнорирую.

Ответ 3

Создайте .gitignore в pw-spec, в который вы вставляете эти две строки:

*.js
*/*.js

Также обратите внимание, что если у вас уже есть файлы, отслеживаемые в этом подкаталоге, которые вы хотите "не отслеживать", вы должны сделать их неизвестными для индекса как такового:

git rm --cached path/to/file

Например, если в каталоге pw-spec вы можете сделать:

find -type f -name "*.js" | xargs git rm --cached