Search code examples
gitshellglobgitignore

Difference between ** and * in glob matching (.gitignore)


I have the following directory structure and files.

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

I would like to ignore all *.js files anywhere within pw-spec directory.

However, adding the following patterns to .gitignore doesn't cut it:

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

The problem is that the second one only matches js files that are exactly 1 level deep within the tree, while I want to match all js files under pw-spec.

Doing

ls pw-spec/**/*.js

produces [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

As you can see

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

are missing from [1].


Solution

  • The difference is that ** doesn't work, at least not for everyone. See

    Why doesn't gitignore work in this case?

    You can have a separate .gitignore in pw-spec/