On Thu, Apr 08, 2021 at 10:25:15AM -0700, Junio C Hamano wrote: > Patrick Steinhardt <ps@xxxxxx> writes: > > > 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. > > Yeah, having to unset HOME would affect not just Git. Git may call > out something else (e.g. an editor) that may want to know where HOME > is, Git may be used in something else (e.g. an IDE) that may want to > know where HOME is. Same for XDG_CONFIG_HOME. If it is a valid need > to not reading from $HOME/.gitconfig, unsetting HOME is an unacceptable > approach to satisfying that need. We actually used to have GIT_CONFIG_NOGLOBAL, which was used in the test suite. But after switching to setting $HOME, it went away in 8f323c00dd (config: drop support for GIT_CONFIG_NOGLOBAL, 2011-03-15). I agree that it's a little more awkward these days because of $XDG_CONFIG_HOME (and also because it influences other programs besides Git). I'm not particularly opposed to re-adding it, but I do think having an environment variable for "read this file instead", as you suggested below, would be much better. It's a superset of the "no" functionality, and would also let us improve our test coverage (especially if we add a matching one for "system" config). Looking at your suggestion: > So, from these two perspective, for the longer term end-user > experience, I am not 100% onboard with GIT_CONFIG_NOGLOBAL. An > alternative that allows us to move away from GIT_CONFIG_NOSYSTEM in > the direction to the tangent #2 would be not to repeat the same > mistake by doing GIT_CONFIG_NOGLOBAL, and instead adding > GIT_CONFIG_GLOBAL, which is > > (1) when not set, it does not do anything, > > (2) when set to "/dev/null" (a literal string; you do not have to > spell it "NUL" when on Windows), it acts just like the case > where your GIT_CONFIG_NOSYSTEM is set, > > (3) when set to any other string, it is taken as a filename that > has the global configuration. Unlike $HOME/.gitconfig or > $XDG_HOME/git/config, it is an error if the named file does not > exist (this is to catch misconfiguration). > > And once this is accepted by users and established as a pattern, we > could migrate GIT_CONFIG_NOSYSTEM to GIT_CONFIG_SYSTEM=/dev/null That seems pretty reasonable. I'm on the fence on your (3). Conceivably somebody could want to override the baked-in defaults without being sure the file is present. But I'm not sure how useful that would be in practice. Some other things to consider: - does setting GIT_CONFIG_GLOBAL override both the $HOME and $XDG_CONFIG_HOME? If the plan is to override them, that makes sense. But we do usually read from both of them, so conceivably you might want to override just one? That's probably over-engineering, though. - if we have config for "read from this file instead of the system config" and "read from this instead of the user-level config", then I wonder if people will want "read this instead of the repo config". We have resisted having GIT_CONFIG mean that for many years, because I think it gets awkward in some cases (e.g., we'd still want to read it for core.repositoryformatversion, etc). I'm OK with drawing the line there and saying it's not a support feature, but we should be prepared to explain it to users (in the docs or at least in the commit message adding the system/global override variables). -Peff