Re: git 2.34.0: Behavior of `**` in gitignore is different from previous versions.
- From
Derrick Stolee <stolee@gmail.com>
- Date
- Nov 18, 2021, 22:09 UTC
- Message-ID
- <2bd2269f-c7f1-7afb-7052-48fac148dffd@gmail.com>
- In-Reply-To
- <YZaHpJKeyDEY8qKW@coredump.intra.peff.net>
On 11/18/2021 12:04 PM, Jeff King wrote:
Show 35 quoted lines
> 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