On Thu, Jun 30, 2022 at 06:13:55PM +0000, Glen Choo via GitGitGadget wrote: > From: Glen Choo <chooglen@xxxxxxxxxx> > > In a subsequent commit, we will introduce "protected configuration", > which is easiest to describe in terms of configuration scopes (i.e. it's > the union of the 'system', 'global', and 'command' scopes). This > description is fine for ML discussions, but it's inadequate for end > users because we don't provide a good description of "configuration > scopes" in the public docs. > > 145d59f482 (config: add '--show-scope' to print the scope of a config > value, 2020-02-10) introduced the word "scope" to our public docs, but > that only enumerates the scopes and assumes the user can figure out > those values mean. Thanks, I think that "scope" is an appropriate term here. When I originally read this patch, I was thinking that "origin" would be more appropriate, since I was recalling the `--show-origin` option to `git config`. But that shows the file name, and `--show-scope` is a separate option entirely. The latter is definitely more appropriate here, so I think this choice of naming is good and makes sense. > diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt > index 9376e39aef2..f93d437b898 100644 > --- a/Documentation/git-config.txt > +++ b/Documentation/git-config.txt > @@ -297,8 +297,8 @@ The default is to use a pager. > FILES > ----- > > -If not set explicitly with `--file`, there are four files where > -'git config' will search for configuration options: > +By default, 'git config' will read configuration options from multiple > +files: > > $(prefix)/etc/gitconfig:: > System-wide configuration file. > @@ -322,27 +322,63 @@ $GIT_DIR/config.worktree:: > This is optional and is only searched when > `extensions.worktreeConfig` is present in $GIT_DIR/config. > > -If no further options are given, all reading options will read all of these > -files that are available. If the global or the system-wide configuration > -file are not available they will be ignored. If the repository configuration > -file is not available or readable, 'git config' will exit with a non-zero > -error code. However, in neither case will an error message be issued. > +You may also provide additional configuration parameters when running any > +git command by using the `-c` option. See linkgit:git[1] for details. > + > +Options will be read from all of these files that are available. If the > +global or the system-wide configuration file are not available they will be > +ignored. If the repository configuration file is not available or readable, > +'git config' will exit with a non-zero error code. However, in neither case > +will an error message be issued. Nit: the last sentence is a little awkwardly worded. Perhaps just: "Note that neither case produces an error message". > -All writing options will per default write to the repository specific > +By default, options are only written to the repository specific > configuration file. Note that this also affects options like `--replace-all` Should we mention that this is the same as the "local" scope below? > and `--unset`. *'git config' will only ever change one file at a time*. > > -You can override these rules using the `--global`, `--system`, > -`--local`, `--worktree`, and `--file` command-line options; see > -<<OPTIONS>> above. > +You can change the way options are read/written by specifying the path to a > +file (`--file`), or by specifying a configuration scope (`--system`, > +`--global`, `--local`, `--worktree`); see <<OPTIONS>> above. I think this paragraph could be slightly more descriptive about what `--file` does while still linking out to <<OPTIONS>> above for more detailed information. In the pre-image, we say: If not set explicitly with `--file`, there are four files will `git config will search`. So I wonder if something more descriptive in this section might be: You can limit which configuration sources are read to or written from by specifying the path of a file with the `--file` option, or by specifying a scope with `--system`, `--global`, `--local`, or `--worktree`. For more, see <<OPTIONS>> above. I don't think that's so different form what you wrote, but I think it's a little clearer particularly what `--file` does (instead of "change the way options are read/written" it "limit[s] which configuration sources are read to or written from"). > + > +SCOPES > +------ > + > +Each configuration source falls within a configuration scope. The scopes > +are: > + > +system:: > + $(prefix)/etc/gitconfig > + > +global:: > + $XDG_CONFIG_HOME/git/config > ++ > +~/.gitconfig > + > +local:: > + $GIT_DIR/config > + > +worktree:: > + $GIT_DIR/config.worktree > + > +command:: > + environment variables > ++ > +the `-c` option > + > +With the exception of 'command', each scope corresponds to a command line > +option - `--system`, `--global`, `--local`, `--worktree`. I think a colon after "option" is more appropriate than a single "-" dash character, but this is definitely a trivial matter that I have no strong opinion on. One thing that this reminds me of (which I don't think is worth taking up here, but perhaps in a future series, or as #leftoverbits) would be promoting these scopes behind a single option. Back in the day, you could ask for values out of `git config` by specifying their type with `--int`, `--bool`, or similar. In e3e042b185 (Merge branch 'tb/config-type', 2018-05-08), we changed to `--type=<int|bool|color|etc>`, which unified things and made it clearer which options were grouped together by a single concept. I think a similar change would make sense here, that is to replace `--system`, `--global` (and so on) with `--scope=system`, `--scope=global`, etc. But that's not material to this series, and just something to think about for later on if you end up thinking it's a good idea. > + > +When reading options, specifying a scope will only read options from the > +files within that scope. When writing options, specifying a scope will write > +to the files within that scope (instead of the repository specific > +configuration file). See <<OPTIONS>> above for a complete description. > > +Most configuration options are respected regardless of the scope it is > +defined in, but some options are only respected in certain scopes. See the > +option's documentation for the full details. I assume "the option's" is referring to whichever configuration variable we're talking about. So it may be clearer to say "See the *respective* option's documentation for more information" or similar. Thanks, Taylor