In fact, per https://github.com/git/git/commit/859b7f1d0e742493d2a9396794cd9040213ad846, having only a negative pattern is like having a catch-all positive pattern and the negative pattern (since git 2.13.0). Thus, adding the positive pattern yields the same results: > git --no-pager grep foo HEAD -- ':!fileA' . HEAD:fileB:foo is false+ > git --no-pager grep foo HEAD -- ':!fileB' . HEAD:fileA:foo HEAD:fileB:foo is false+ Le mer. 24 oct. 2018 à 17:14, Duy Nguyen <pclouds@xxxxxxxxx> a écrit : > > On Wed, Oct 24, 2018 at 4:55 PM Christophe Bliard > <christophe.bliard@xxxxxxxxx> wrote: > > > > Hi, > > > > I observed an unexpected behavior while using git grep with both git > > 2.19.1 and 2.14.3. Here is how to reproduce it: > > > > > git init > > Initialized empty Git repository in /private/tmp/hello/.git/ > > > echo foo > fileA > > > echo 'foo is false+' > fileB > > > git add fileA > > > git commit -m fileA > > [master (root-commit) f2c83e7] fileA > > 1 file changed, 1 insertion(+) > > create mode 100644 fileA > > > git add fileB > > > git commit -m fileB > > [master e35df26] fileB > > 1 file changed, 1 insertion(+) > > create mode 100644 fileB > > > git --no-pager grep foo HEAD -- ':!fileA' > > HEAD:fileB:foo is false+ > > > git --no-pager grep foo HEAD -- ':!fileB' > > HEAD:fileA:foo > > HEAD:fileB:foo is false+ > > > > In the last command, fileB appears in grep results but it should have > > been excluded. > > > > If the HEAD parameter is removed, it works as expected: > > It's probably a bug. We have different code paths for matching things > with or without HEAD, roughly speaking. I'll look into to this more on > the weekend, unless somebody (is welcome to) beats me first. > > Another thing that might also be a problem is, negative patterns are > supposed to exclude stuff from "something" but you don't specify that > "something" (i.e. positive patterns) in your grep commands above. If > "grep foo HEAD -- :/ ':!fileB'" works, then you probably just run into > some undefined corner case. > -- > Duy