Разница между ** и * в сопоставлении глобуса (.gitignore) - PullRequest
17 голосов
/ 12 января 2012

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

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].

Ответы [ 3 ]

8 голосов
/ 12 января 2012

Разница в том, что ** не работает, по крайней мере, не для всех. См

Почему в этом случае gitignore не работает?

Вы можете иметь отдельный .gitignore в pw-spec/

7 голосов
/ 19 июня 2012

Существует два подхода к этому типу ситуации, в зависимости от ваших потребностей.

Одно из решений - поместить

# generated files
*.js

в pw-spec / .gitignore.

Второе решение состоит в том, чтобы поместить:

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

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

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

2 голосов
/ 12 января 2012

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

*.js
*/*.js

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

git rm --cached path/to/file

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

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