threads / discuss / 49364

Cannot negate `*` ignore pattern for directory with space in the name

Subject: Cannot negate `*` ignore pattern for directory with space in the name

## tl;dr

3 messages between Sep 18, 2018 and Sep 18, 2018.

replies: 2people: 2as markdown or json

Victor Engmark· Sep 18, 2018, 04:03 UTC · lore
To reproduce (from <https://unix.stackexchange.com/q/469708/3645>):

$ cd "$(mktemp --directory)" $ mkdir foo\ bar $ touch foo\ bar/test $ git init Initialized empty Git repository in /tmp/tmp.iGmBR6y2xR/.git/ $ git status --short ?? foo bar/ $ cat > .gitignore << EOF

Show 12 quoted lines
> *
> !foo bar
> !foo\ bar
> !"foo bar"
> "!foo bar"
> !foo*
> !foo bar/
> !foo\ bar/
> !"foo bar/"
> "!foo bar/"
> !foo*/
> EOF

$ git status --short [no output]

The pattern *can* be negated if it only matches directories:
$ cat > .gitignore << EOF
> */
> !foo\ bar/
> EOF

$ git status --short ?? .gitignore ?? foo bar/

I encountered this problem because Visual Studio Code creates a configuration directory called "Code - OSS", and I exclude everything in ~/.config by default to avoid noise in `git status`.

$ git --version git version 2.19.0

-- 
Kind regards
Victor Engmark
Duy Nguyen· Sep 18, 2018, 17:59 UTC · re: Victor Engmark · lore

Re: Cannot negate `*` ignore pattern for directory with space in the name

On Tue, Sep 18, 2018 at 6:13 AM Victor Engmark <victorengmark@catalyst.net.nz> wrote:

Show 15 quoted lines
>
> To reproduce (from <https://unix.stackexchange.com/q/469708/3645>):
>
> $ cd "$(mktemp --directory)"
> $ mkdir foo\ bar
> $ touch foo\ bar/test
> $ git init
> Initialized empty Git repository in /tmp/tmp.iGmBR6y2xR/.git/
> $ git status --short
> ?? foo bar/
> $ cat > .gitignore << EOF
> > *
> > !foo bar
> > !foo\ bar
> > !"foo bar"

No need to quote, either with double quotes or backslashes. They are interpreted as literal " and \

> $ git status --short
> [no output]

It's not exactly a bug, more like a trap. '*' matches anything, at every level. So even if you negate 'foo bar', when we check 'foo bar/test', '*' pattern applies again and ignores 'foo bar/test'. If the first line in .gitignore is /* instead of * (to keep match anything at the top level directory only), then it should work.

-- 
Duy
Victor Engmark· Sep 18, 2018, 21:03 UTC · re: Duy Nguyen · lore

Re: Cannot negate `*` ignore pattern for directory with space in the name

On 19/09/2018 05:59, Duy Nguyen wrote:
> On Tue, Sep 18, 2018 at 6:13 AM Victor Engmark
> <victorengmark@catalyst.net.nz> wrote:
[…]
Show 8 quoted lines
>> $ cat > .gitignore << EOF
>>> *
>>> !foo bar
>>> !foo\ bar
>>> !"foo bar"
> 
> No need to quote, either with double quotes or backslashes. They are
> interpreted as literal " and \
Thanks! I just tried a bunch of things to see if anything stuck.
Show 8 quoted lines
>> $ git status --short
>> [no output]
> 
> It's not exactly a bug, more like a trap. '*' matches anything, at
> every level. So even if you negate 'foo bar', when we check 'foo
> bar/test', '*' pattern applies again and ignores 'foo bar/test'. If
> the first line in .gitignore is /* instead of * (to keep match
> anything at the top level directory only), then it should work.

You're right, I've managed to induce the placebo effect in myself :) Thank you for the help, and sorry for the noise!

-- 
Cheers
Victor

← back to recent threads