Thanks, everyone, for your comments. I've followed Glen's code suggestion and Junio's documentation suggestion, as you can see in the range-diff. Jonathan Tan (2): config: make git_config_include() static config: include file if remote URL matches a glob Documentation/config.txt | 27 ++++++++ config.c | 132 ++++++++++++++++++++++++++++++++++++--- config.h | 46 ++++---------- t/t1300-config.sh | 118 ++++++++++++++++++++++++++++++++++ 4 files changed, 282 insertions(+), 41 deletions(-) Range-diff against v6: 1: b2dcae03ed = 1: b2dcae03ed config: make git_config_include() static 2: de2be06818 ! 2: 7c70089074 config: include file if remote URL matches a glob @@ Documentation/config.txt: all branches that begin with `foo/`. This is useful if +Files included by this option (directly or indirectly) are not allowed +to contain remote URLs. ++ -+This keyword is designed to be forwards compatible with a naming -+scheme that supports more variable-based include conditions, but -+currently Git only supports the exact keyword described above. ++Note that unlike other includeIf conditions, resolving this condition ++relies on information that is not yet known at the point of reading the ++condition. A typical use case is this option being present as a ++system-level or global-level config, and the remote URL being in a ++local-level config; hence the need to scan ahead when resolving this ++condition. In order to avoid the chicken-and-egg problem in which ++potentially-included files can affect whether such files are potentially ++included, Git breaks the cycle by prohibiting these files from affecting ++the resolution of these conditions (thus, prohibiting them from ++declaring remote URLs). +++ ++As for the naming of this keyword, it is for forwards compatibiliy with ++a naming scheme that supports more variable-based include conditions, ++but currently Git only supports the exact keyword described above. + A few more notes on matching via `gitdir` and `gitdir/i`: @@ config.c: static int git_config_include(const char *var, const char *value, void + if (inc->opts->unconditional_remote_url) + inc->fn = forbid_remote_url; ret = handle_path_include(value, inc); -+ if (inc->opts->unconditional_remote_url) -+ inc->fn = old_fn; ++ inc->fn = old_fn; + } return ret; -- 2.34.1.173.g76aa8bc2d0-goog