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

22,256

Solution 1

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/

Solution 2

There are two approaches for this type of situation, depending on your needs.

One solution is to put

# generated files
*.js

in pw-spec/.gitignore.

The second solution is to put:

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

and so forth in the main .gitignore file.This approach is brittle if more sub-directories are added.

I generally prefer to put the .gitignore file at the same level as the Makefile which generates the files that I am ignoring.

Solution 3

Create a .gitignore in pw-spec in which you insert these two lines:

*.js
*/*.js

Also note that if you already have files tracked in this subdirectory which you want "untracked", you have to make them unknown to the index as such:

git rm --cached path/to/file

For instance, if in directory pw-spec you can do:

find -type f -name "*.js" | xargs git rm --cached
Share:
22,256
Emil Ivanov
Author by

Emil Ivanov

Passionate chap.

Updated on April 20, 2020

Comments

  • Emil Ivanov
    Emil Ivanov about 4 years

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