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

2 messages from 2025-08-21 to 2025-08-25. Participants: engdoc, Junio C Hamano.
Thread: https://gitlist.dev/t/64004

## engdoc, 2025-08-21 04:29

Subject: [RFC] Allow includeIf.hasconfig to take precedence over includeIf.gitdir
Message-ID: <a903afc8-9bf6-4ba8-bdab-87a76adf631e.engdoc@aliyun.com>
URL: https://gitlist.dev/e/a903afc8-9bf6-4ba8-bdab-87a76adf631e.engdoc%40aliyun.com

```


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, 2025-08-25 19:40

Subject: Re: [RFC] Allow includeIf.hasconfig to take precedence over includeIf.gitdir
Message-ID: <xmqq1pozqjfi.fsf@gitster.g>
URL: https://gitlist.dev/e/xmqq1pozqjfi.fsf%40gitster.g
In-Reply-To: <a903afc8-9bf6-4ba8-bdab-87a76adf631e.engdoc@aliyun.com>

```
"engdoc" <engdoc@aliyun.com> writes:

[administrivia: please wrap overly long 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.

```
