While it's already possible to stop git from reading the system config via GIT_CONFIG_NOSYSTEM, doing the same for global config files requires the user to unset both HOME and XDG_CONFIG_HOME. This is an awkward interface and may even pose a problem e.g. when git hooks rely on these variables to be present. Introduce a new GIT_CONFIG_NOGLOBAL envvar, which is the simple equivalent to GIT_CONFIG_NOSYSTEM. If set to true, git will skip reading both `~/.gitconfig` and `$XDG_CONFIG_HOME/git/config`. Signed-off-by: Patrick Steinhardt --- Documentation/git-config.txt | 4 ++++ Documentation/git.txt | 16 ++++++++++++---- config.c | 9 +++++++-- t/t1300-config.sh | 31 +++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt index 4b4cc5c5e8..88cd064abb 100644 --- a/Documentation/git-config.txt +++ b/Documentation/git-config.txt @@ -340,6 +340,10 @@ GIT_CONFIG:: Using the "--global" option forces this to ~/.gitconfig. Using the "--system" option forces this to $(prefix)/etc/gitconfig. +GIT_CONFIG_NOGLOBAL:: + Whether to skip reading settings from the global ~/.gitconfig and + $XDG_CONFIG_HOME/git/config files. See linkgit:git[1] for details. + GIT_CONFIG_NOSYSTEM:: Whether to skip reading settings from the system-wide $(prefix)/etc/gitconfig file. See linkgit:git[1] for details. diff --git a/Documentation/git.txt b/Documentation/git.txt index 3a9c44987f..4462bd2da9 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -670,13 +670,21 @@ for further details. If this environment variable is set to `0`, git will not prompt on the terminal (e.g., when asking for HTTP authentication). +`GIT_CONFIG_NOGLOBAL`:: + Whether to skip reading settings from the system-wide `~/.gitconfig` + and `$XDG_CONFIG_HOME/git/config` files. This environment variable can + be used along with `$GIT_CONFIG_NOSYSTEM` to create a predictable + environment for a picky script, or you can set it temporarily to avoid + using a buggy global config file while waiting for someone with + sufficient permissions to fix it. + `GIT_CONFIG_NOSYSTEM`:: Whether to skip reading settings from the system-wide `$(prefix)/etc/gitconfig` file. This environment variable can - be used along with `$HOME` and `$XDG_CONFIG_HOME` to create a - predictable environment for a picky script, or you can set it - temporarily to avoid using a buggy `/etc/gitconfig` file while - waiting for someone with sufficient permissions to fix it. + be used along with `$GIT_CONFIG_NOGLOBAL` to create a predictable + environment for a picky script, or you can set it temporarily to avoid + using a buggy `/etc/gitconfig` file while waiting for someone with + sufficient permissions to fix it. `GIT_FLUSH`:: If this environment variable is set to "1", then commands such diff --git a/config.c b/config.c index 6428393a41..19c1b31c75 100644 --- a/config.c +++ b/config.c @@ -1879,6 +1879,11 @@ int git_config_system(void) return !git_env_bool("GIT_CONFIG_NOSYSTEM", 0); } +static int git_config_global(void) +{ + return !git_env_bool("GIT_CONFIG_NOGLOBAL", 0); +} + static int do_git_config_sequence(const struct config_options *opts, config_fn_t fn, void *data) { @@ -1903,10 +1908,10 @@ static int do_git_config_sequence(const struct config_options *opts, data); current_parsing_scope = CONFIG_SCOPE_GLOBAL; - if (xdg_config && !access_or_die(xdg_config, R_OK, ACCESS_EACCES_OK)) + if (git_config_global() && xdg_config && !access_or_die(xdg_config, R_OK, ACCESS_EACCES_OK)) ret += git_config_from_file(fn, xdg_config, data); - if (user_config && !access_or_die(user_config, R_OK, ACCESS_EACCES_OK)) + if (git_config_global() && user_config && !access_or_die(user_config, R_OK, ACCESS_EACCES_OK)) ret += git_config_from_file(fn, user_config, data); current_parsing_scope = CONFIG_SCOPE_LOCAL; diff --git a/t/t1300-config.sh b/t/t1300-config.sh index e0dd5d65ce..0754189974 100755 --- a/t/t1300-config.sh +++ b/t/t1300-config.sh @@ -2059,6 +2059,37 @@ test_expect_success '--show-scope with --show-origin' ' test_cmp expect output ' +test_expect_success 'GIT_CONFIG_NOGLOBAL' ' + test_when_finished rm -f "$HOME"/.config/git && + cat >"$HOME"/.gitconfig <<-EOF && + [home] + config = true + EOF + mkdir -p "$HOME"/.config/git && + cat >"$HOME"/.config/git/config <<-EOF && + [xdg] + config = true + EOF + cat >.git/config <<-EOF && + [local] + config = true + EOF + + cat >expect <<-EOF && + global xdg.config=true + global home.config=true + local local.config=true + EOF + git config --show-scope --list >output && + test_cmp expect output && + + cat >expect <<-EOF && + local local.config=true + EOF + GIT_CONFIG_NOGLOBAL=true git config --show-scope --list >output && + test_cmp expect output +' + for opt in --local --worktree do test_expect_success "$opt requires a repo" ' -- 2.31.1