Re: [PATCH 00/11] [RFC] config-batch: a new builtin for tools querying config
- From
Derrick Stolee <stolee@gmail.com>
- Date
- Feb 5, 2026, 13:52 UTC
- Message-ID
- <f6687192-58dd-479e-8df5-a422c01f03f4@gmail.com>
- In-Reply-To
- <aYPeiqkw41ln7De_@fruit.crustytoothpaste.net>
On 2/4/2026 7:04 PM, brian m. carlson wrote:
Show 12 quoted lines
> On 2026-02-04 at 14:19:52, Derrick Stolee via GitGitGadget wrote: >> This RFC explores a new git config-batch builtin that allows tools to >> interact with Git's config data with multiple queries using a single >> process. This is an orthogonal alternative to the effort to create a stable, >> linkable config API. Both approaches have different strengths. >> >> My main motivation is the performance of git-credential-manager on Windows >> platforms as it can call git config get dozens of times. At 150-200ms per >> execution, that adds up significantly, leading to multiple seconds just to >> load a credential that already exists. I believe that there are other >> benefits to having this interface available, but I can't recall any >> specifics at the moment.
Show 7 quoted lines
>> * Is this a worthwhile feature to add to Git? > > Git LFS has the same needs, but I believe it can use `git config -l -z` > to do that and parse the config options itself. If this is just config > fetching, I'm not sure of the additional utility that such a feature > would add. If that interface _almost_ meets your needs, could we add > functionality there instead of a new interface?
This is a good suggestion to look into as a potentially-easier solution.
There may be some work required on the consumer to interpret multiple values and the right inheritance rules. This is relatively minor compared to attempting a full parser with complicated 'includeIf' logic. > If you need to set many keys, I'm curious as to why that is.
I know that the credential manager does more than just query the config, but also sets and unsets config. The full interface is here [1]. However, the performance-critical parts may not require mutating configuration values, and hence such a
[1] https://github.com/git-ecosystem/git-credential-manager/blob/main/src/shared/Core/GitConfiguration.cs#L31
Thanks for the pointer to git-lfs as a similar use case. I see that it has a way to get the full list of config values [2] with '-l' (but not '-z'). It also has methods for getting values on a per-key (or even per-file) basis. I have not tracked the uses of config code into its consumers to know how often one is used over the other.
[2] https://github.com/git-lfs/git-lfs/blob/bb65882304a655ffa8abf2be6922e53ff18af5a5/git/config.go#L208
Thanks, -Stolee