threads / rfc / 64004

[RFC] Allow includeIf.hasconfig to take precedence over includeIf.gitdir

Subject: [RFC] Allow includeIf.hasconfig to take precedence over includeIf.gitdir

## tl;dr

2 messages between Aug 21, 2025 and Aug 25, 2025.

replies: 1people: 2as markdown or json

engdoc· Aug 21, 2025, 04:29 UTC · lore

Hello Git developers, I would like to request a feature regarding the priority of conditional includes in Git configuration.

Background: Currently, when both includeIf.gitdir and includeIf.hasconfig conditions match for a repository, Git always processes gitdir first, regardless of the order in the config file. This behavior is hardcoded and cannot be changed by users.

My use case: In my workflow, due to the current priority order, the gitdir include always takes precedence, making it impossible to override it with hasconfig when both match.

Request: I would like to have a way to make includeIf.hasconfig take precedence over includeIf.gitdir, either by: Allowing users to specify the priority/order of conditional includes, or

Always processing hasconfig before gitdir, or
Providing a configuration option to control this behavior.

Motivation: This would allow more flexible and context-aware configuration setups, especially for teams or users who want to have per-repository overrides based on the presence of certain config files, without being constrained by the repository path.

Thank you for considering this feature request!
Best regards
Junio C Hamano· Aug 25, 2025, 19:40 UTC · re: engdoc · lore

Re: [RFC] Allow includeIf.hasconfig to take precedence over includeIf.gitdir

"engdoc" <engdoc@aliyun.com> writes:
[administrivia: please wrap overly long lines]
Show 5 quoted lines
> Background:
>
> Currently, when both includeIf.gitdir and includeIf.hasconfig
> conditions match for a repository, Git always processes gitdir
> first, regardless of the order in the config file.

Is that true? I created an empty repository in /var/tmp/x/includeIf and added this in its .git/config file:

        [core]
                repositoryformatversion = 0
                filemode = true
                bare = false
                logallrefupdates = true
        [includeIf "hasconfig:remote.*.url:*"]
                path = /var/tmp/x/includeIf/.git/hasRemote
        [includeIf "gitdir:/var/tmp/x/includeIf/.git"]
                path = /var/tmp/x/includeIf/.git/Here
        [remote "this"]
                url = .
where hasRemote and Here each have a single line
	[jch] included = hasRemote  # in hasRemote
	[jch] included = Here       # in Here
With that preparation done, I tried
    $ git config list --local --includes
    core.repositoryformatversion=0
    core.filemode=true
    core.bare=false
    core.logallrefupdates=true
    includeif.hasconfig:remote.*.url:*.path=/var/tmp/x/includeIf/.git/hasRemote
    jch.included=hasRemote
    includeif.gitdir:/var/tmp/x/includeIf/.git.path=/var/tmp/x/includeIf/.git/Here
    jch.included=Here
    remote.this.url=.

Notice that the multi-valued configuration variable jch.included gets hasRemote first and then Here second.

Then I swapped the two includeIf in the .git/config file and ran the experiment again.

    $ git config list --local --includes
    core.repositoryformatversion=0
    core.filemode=true
    core.bare=false
    core.logallrefupdates=true
    includeif.gitdir:/var/tmp/x/includeIf/.git.path=/var/tmp/x/includeIf/.git/Here
    jch.included=Here
    includeif.hasconfig:remote.*.url:*.path=/var/tmp/x/includeIf/.git/hasRemote
    jch.included=hasRemote
    remote.this.url=.

I do not doubt that you are having some problem, but it does not look to me that your description above points to the source of the problem.

← back to recent threads