On 11/18/2021 12:04 PM, Jeff King wrote: > On Thu, Nov 18, 2021 at 08:11:04PM +0330, Danial Alihosseini wrote: > >> What did you do before the bug happened? (Steps to reproduce your issue) >> Consider the following project structure >> - data >> - data1 >> - file1 >> - file1.txt >> - data2 >> - file2 >> - file2.txt >> - .gitignore >> >> >> `.gitignore` is as follows: >> ``` >> data/** >> !data/**/ >> !data/**/*.txt >> ``` >> What did you expect to happen? (Expected behavior) >> >> I expect all files in `data` folder to be ignored except `.txt` files. >> >> What happened instead? (Actual behavior) >> >> `file1` and `file2` are not ignored. >> Here is the `check-ignore` output: >> ``` >> $ git check-ignore -v data/data1/file1 >> .gitignore:2:!/data/**/ data/data1/file1 >> ``` > > Thanks for an easy reproduction. It looks like this changed in > f6526728f9 (dir: select directories correctly, 2021-09-24). Author cc'd. Thanks for the bisect and CC. > The key thing seems to be that the second line of your .gitignore should > match only directories (because of the trailing slash), but no longer > does. Doesn't "matching only directories" mean it would match everything within that directory? (It also means that "data/file" is not matched, which is still correct.) My interpretation of these patterns is that everything in data/data1/ and data/data2/ should not be ignored, making it seem like the change fixed a bug (it definitely changed behavior). Just for extra clarity, this test currently passes: test_expect_success 'directories and ** matches' ' cat >.gitignore <<-\EOF && data/** !data/**/ !data/**/*.txt EOF git check-ignore file \ data/file data/data1/file1 data/data1/file1.txt \ data/data2/file2 data/data2/file2.txt >actual && cat >expect <<-\EOF && data/file EOF test_cmp expect actual ' but the previous behavior would have passed this test: test_expect_success 'directories and ** matches' ' cat >.gitignore <<-\EOF && data/** !data/**/ !data/**/*.txt EOF git check-ignore file \ data/file data/data1/file1.txt \ data/data2/file2.txt >actual && cat >expect <<-\EOF && data/file EOF test_cmp expect actual ' I seek more clarity on this. Specifically: if we match a directory then should we not also match the contents within? Thanks, -Stolee