Subject: Re: [PATCH 2/2] ref-filter: support filtering of operational refs

From: Junio C Hamano <[email-masked]>
Date: Tue, 02 Jan 2024 08:49:51 -0800

Karthik Nayak <[email-masked]> writes:

>> As "git for-each-ref" takes pattern that is prefix match, e.g.,
>>
>>     $ git for-each-ref refs/remotes/
>>
>> shows everything like refs/remotes/origin/main that begins with
>> refs/remotes/, I wonder if
>>
>>     $ git for-each-ref ""
>>
>> should mean what you are asking for.  After all, "git for-each-ref"
>> does *not* take "--branches" and others like "git log" family to
>> limit its operation to subhierarchy of "refs/" to begin with.
>
> But I don't think using an empty pattern is the best way to go forward.
> This would break the pattern matching feature. For instance, what if the
> user wanted to print all refs, but pattern match "*_HEAD"?
>
> Would that be
>
>       $ git for-each-ref "" "*_HEAD"

Because you do not omit the leading hierarchy when using globs:

    $ git for-each-ref v2.4\?.\* ;# nothing
    $ git for-each-ref tags/v2.4\?.\* ;# nothing
    $ git for-each-ref refs/tags/v2.4\?.\* ;# gives tags in v2.40 and onwards

I would expect that it would be more like

	$ git for-each-ref "*_HEAD"

And because you can have two or more patterns, e.g.,

    $ git for-each-ref refs/tags/v2.4\?.\* refs/heads/m\*

to get those recent tags and branches whose name begins with 'm', I
would expect your

    $ git for-each-ref "" "*_HEAD"

would probably be equivalent to

    $ git for-each-ref ""