[PATCH 0/5] [RFC] Make 'git config list --type=' parse and filter types
- From
Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Feb 10, 2026, 04:42 UTC
- Message-ID
- <pull.2044.git.1770698579.gitgitgadget@gmail.com>
I started down this road based on feedback on my 'git config-batch' RFC [1].
[1] https://lore.kernel.org/git/pull.2033.git.1770214803.gitgitgadget@gmail.com/
I had described my intention to use 'git config-batch' as a single process to load multiple config values one-by-one. Brian mentioned that 'git config list -z' would probably suffice, so I started experimenting in that direction [2].
[2] https://github.com/git-ecosystem/git-credential-manager/compare/main...derrickstolee:config-list
However, I ran into a problem: the most critical performance bottleneck is related to path-formatted config values that are queried with 'git config get --type=path -z'. It wasn't hard to update things to lazily load the full list of config values by type [3], but I then noticed a big problem!
[3] https://github.com/git-ecosystem/git-credential-manager/commit/d403c8e24ce6f37da920cce23842dd5a6cf6481d
Problem: 'git config list' doesn't respect --type=<X>!
This boils down to the fact that the iterator function show_all_config() doesn't call format_config(), which includes the type-parsing code.
This wasn't super trivial to update:
1. format_config() uses git_config_parse_*() methods, which die() on a bad
parse.
2. The path parsing code didn't have a gentle version.
3. The two paths ('git config list' and 'git config --list') needed to
standardize their display options to work with format_config().
4. Finally, we need to filter out key-value pairs that don't match the
given type.This is marked as an RFC because I need to add some more tests and because this is a behavior change! If there are any tools currently passing the --type=<X> argument to git config list then they will have a change of behavior with this series. It's an easy workaround: drop the --type argument or add --no-type to go back to the previous behavior.
Thanks for any and all feedback, -Stolee
Derrick Stolee (5): config: move show_all_config() parse: add git_parse_maybe_pathname() config: allow format_config() to filter config: create special init for list mode config: make 'git config list --type=<X>' work
Documentation/git-config.adoc | 3 + builtin/config.c | 130 ++++++++++++++++++++++++---------- config.c | 14 +--- parse.c | 24 +++++++ parse.h | 2 + t/t1300-config.sh | 26 ++++++- 6 files changed, 147 insertions(+), 52 deletions(-)
base-commit: 67ad42147a7acc2af6074753ebd03d904476118f Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2044%2Fderrickstolee%2Fconfig-list-type-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2044/derrickstolee/config-list-type-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/2044
-- gitgitgadget