From: Piotr Siupa Date: Tue, 10 Jun 2025 09:41:49 GMT Subject: Re: [BUG]: Non-matching exclude pathspec causes an error in empty repository when the flag "--update" is present Message-ID: In-Reply-To: On Mon, Jun 2, 2025 at 5:31 PM Junio C Hamano wrote: > I have to disagree here. The "did not match" error is telling you > this: > > You tried to tell me that you wanted to add something, but you > didn't enumerate what to add in concrete terms. You instead > gave me pathspec, so I tried to see if there are paths that > match these patterns. This pattern did not produce any match > so out of this pattern came no additions (even though other > patterns may have contributed to other additions). > > I think the "'.' did not match any file(s)" in the first example > makes perfect sense, but complaining about negative patterns that > did not match does not make much sense to me. [...] That would be my interpretation too. I mostly use the negative patterns for scripting. In scripts, unmatched negative patterns are more the rule than an exception, since you have to take into account all possible exclusions, without the foreknowledge of what will actually be present in the repository. From my experience, a failing command is never what you want in such situations. (For now, I added "--ignore-errors" to the script I'm writing and I hope this won't cause any bugs related to positive patterns.) Another thing to consider is that if the behavior of non-matching exclude patterns was changed now, it would break a lot of existing scripts that rely on the current behavior.
On Mon, Jun 2, 2025 at 5:31 PM Junio C Hamano <gitster@pobox.com> wrote:
Phillip Wood <phillip.wood123@gmail.com> writes:

>> git add --update -- ':(exclude)foo'
>> This results in:
>> error: pathspec ':(exclude)foo' did not match any file(s) known to git
>> error: pathspec '.' did not match any file(s) known to git
> ...
> git add -u builtin ':(exclude)*.[ch]'
>
> which will never add any files (the builtin directory only contains
> '.c' and '.h' files). So I think maybe the bug is that we don't print
> an error when there are tracked files and an exclude pattern matches
> everything

I have to disagree here.  The "did not match" error is telling you
this:

    You tried to tell me that you wanted to add something, but you
    didn't enumerate what to add in concrete terms.  You instead
    gave me pathspec, so I tried to see if there are paths that
    match these patterns.  This pattern did not produce any match
    so out of this pattern came no additions (even though other
    patterns may have contributed to other additions).

I think the "'.' did not match any file(s)" in the first example
makes perfect sense, but complaining about negative patterns that
did not match does not make much sense to me.  If I said

        git add -- \*.c ':!auto-generated.c'

and there is no auto-generated.c file (yet) in this working tree,
that is a happy outcome.  I didn't want to add it, even if it
existed, and it turned out to be missing.  It would become annoying
pretty quickly if we started complaining a pattern in .gitignore
that did not match anything, and complaining against "you gave me an
exclude pathspec pattern that matched nothing" feels pretty similar
to me.

Thanks.