threads / bug / 59576

Bug with git-config includeIf

Subject: Bug with git-config includeIf

## tl;dr

4 messages between Apr 11, 2023 and Apr 12, 2023.

replies: 3people: 3as markdown or json

Matthias Beyer· Apr 11, 2023, 16:05 UTC · lore
Hi,
please keep me in CC when replying, I am not subscribed.
I experience the following (seemingly) bug in my git setup:
I have three files for my git configuration:
* ~/.gitconfig -> ~/config/git/gitconfig
* ~/config/git/gitconfig_private
* ~/config/git/gitconfig_work

The gitconfig_private sets my email address to this very email address, the gitconfig_work sets it to me work email address.

The gitconfig file has a `includeIf` directive:
```
[include]
    path = ~/config/git/gitconfig_private                                                                                                                                                                                                                                                                                    
[includeIf "gitdir:~/dev/work/"]
    path = ~/config/git/gitconfig_work   
```

That means, from my understanding, that all git repositories in ~/dev/work should now have the work-related email address set.

If I go to ~/dev/work/somerepo and `git config --get user.email` it indeed shows the expected email address.

But if I go to a subdirectory in that repository, the very same command shows the private email address, and commits get written with that private email address.

Did I miss something obvious or did I discover a bug?
git: 2.38.4

Best, Matthias

Junio C Hamano· Apr 11, 2023, 16:58 UTC · re: Matthias Beyer · lore

Re: Bug with git-config includeIf

Matthias Beyer <mail@beyermatthias.de> writes:
Show 9 quoted lines
> [includeIf "gitdir:~/dev/work/"]
>     path = ~/config/git/gitconfig_work   
> ```
>
> That means, from my understanding, that all git repositories in ~/dev/work 
> should now have the work-related email address set.
>
> If I go to ~/dev/work/somerepo and `git config --get user.email` it indeed 
> shows the expected email address.

The pattern given to "gitdir:" ends with "/" and implicitly "**" is added after it. If "~/dev/work/somerepo" is a repository, going there and "git rev-parse --git-dir" would say ".git" or "~/dev/work/somerepo/.git", then the includeIf should trigger.

> But if I go to a subdirectory in that repository, the very same command shows 
> the private email address, and commits get written with that private email 
> address.

I use exactly the same configuration (not for working on this project, though), and your symptom does not reproduce for me, which puzzles me. I go to an equivelent of your ~/dev/work/somerepo/subdir and "git rev-parse --git-dir" would still report an equivalent of your "~/dev/work/somerepo/.git", and my "git config --show-origin user.name" does point at the value of "includeIf.gitdir:~/dev/work/.path".

I wonder what the difference of the set-up is.  

My ~/dev/work/somerepo/.git equivalent is a directory. Perhas yours is not? That should not cause any difference and it is merely a guess in the dark.

Matthias Beyer· Apr 12, 2023, 06:26 UTC · re: Junio C Hamano · lore

Re: Bug with git-config includeIf

Hi,
thanks for your reply.

I found the issue. As always, one nastly little detail: ~/dev is actually a symlink on my system(s) to ~/archive/development/

git rev-parse --git-dir of course resolves that symlink and thus ~/dev/work/ does not actually match ~/archive/development/

Using that path in the includeIf produces the expected results. 

Thanks for your patience. Matthias

Am Dienstag, 11. April 2023, 18:58:08 CEST schrieb Junio C Hamano:
Show 34 quoted lines
> Matthias Beyer <mail@beyermatthias.de> writes:
> > [includeIf "gitdir:~/dev/work/"]
> > 
> >     path = ~/config/git/gitconfig_work
> > 
> > ```
> > 
> > That means, from my understanding, that all git repositories in ~/dev/work
> > should now have the work-related email address set.
> > 
> > If I go to ~/dev/work/somerepo and `git config --get user.email` it indeed
> > shows the expected email address.
> 
> The pattern given to "gitdir:" ends with "/" and implicitly "**" is
> added after it.  If "~/dev/work/somerepo" is a repository, going
> there and "git rev-parse --git-dir" would say ".git" or
> "~/dev/work/somerepo/.git", then the includeIf should trigger.
> 
> > But if I go to a subdirectory in that repository, the very same command
> > shows the private email address, and commits get written with that
> > private email address.
> 
> I use exactly the same configuration (not for working on this
> project, though), and your symptom does not reproduce for me, which
> puzzles me.  I go to an equivelent of your ~/dev/work/somerepo/subdir
> and "git rev-parse --git-dir" would still report an equivalent of
> your "~/dev/work/somerepo/.git", and my "git config --show-origin user.name"
> does point at the value of "includeIf.gitdir:~/dev/work/.path".
> 
> I wonder what the difference of the set-up is.
> 
> My ~/dev/work/somerepo/.git equivalent is a directory.  Perhas yours
> is not?  That should not cause any difference and it is merely a
> guess in the dark.
Emily Shaffer· Apr 11, 2023, 17:00 UTC · re: Matthias Beyer · lore

Re: Bug with git-config includeIf

On Tue, Apr 11, 2023 at 9:32 AM Matthias Beyer <mail@beyermatthias.de> wrote:
Show 35 quoted lines
>
> Hi,
>
> please keep me in CC when replying, I am not subscribed.
>
> I experience the following (seemingly) bug in my git setup:
>
> I have three files for my git configuration:
>
> * ~/.gitconfig -> ~/config/git/gitconfig
> * ~/config/git/gitconfig_private
> * ~/config/git/gitconfig_work
>
> The gitconfig_private sets my email address to this very email address, the
> gitconfig_work sets it to me work email address.
>
> The gitconfig file has a `includeIf` directive:
>
> ```
> [include]
>     path = ~/config/git/gitconfig_private
>
> [includeIf "gitdir:~/dev/work/"]
>     path = ~/config/git/gitconfig_work
> ```
>
> That means, from my understanding, that all git repositories in ~/dev/work
> should now have the work-related email address set.
>
> If I go to ~/dev/work/somerepo and `git config --get user.email` it indeed
> shows the expected email address.
>
> But if I go to a subdirectory in that repository, the very same command shows
> the private email address, and commits get written with that private email
> address.
One thing that can help a lot to debug is to run `git config --list
--show-scope` from this subdirectory where your config is misbehaving
- that will help you understand which of _private or _work is being
included in the parse, in which order. It could be there is another
stray config overwriting here.
Show 7 quoted lines
>
> Did I miss something obvious or did I discover a bug?
>
> git: 2.38.4
>
> Best,
> Matthias

← back to recent threads