Re: [RFC 00/10] Make .the gitmodules file path configurable
- Date: Thu, 12 Apr 2018 16:36:32 -0700
- From: Stefan Beller <sbeller@xxxxxxxxxx>
- Subject: Re: [RFC 00/10] Make .the gitmodules file path configurable
On Thu, Apr 12, 2018 at 3:20 PM, Antonio Ospite <ao2@xxxxxx> wrote:
> vcsh uses bare git repositories and detached work-trees to manage
> *distinct* sets of configuration files directly into $HOME.
> In general, submodules have worked perfectly fine with detached
> work-trees for some time[2,3,4].
> However when multiple repositories take turns using the same directory
> as their work-tree, and more than one of them want to use submodules,
> there could still be conflicts about the '.gitmodules' file because git
> hardcodes this path.
> For comparison, in case of '.gitignore' a similar conflict might arise,
> but git has alternative ways to specify exclude files, so vcsh solves
> this by setting core.excludesFile for each repository and track ignored
> files somewhere else (in ~/.gitignore.d/$VCSH_REPO_NAME).
> This is currently not possible with submodules configuration.
So far I agree w.r.t. Gits capabilities.
> So this series proposes a mechanism to set an alternative path for the
> submodules configuration file (from now on "gitmodules file").
That sounds interesting, so let's read on.
> Patches are based on fe0a9eaf31dd0c349ae4308498c33a5c3794b293.
... which is the current master branch by Junio.
> In commit 4c0eeafe4755 (cache.h: add GITMODULES_FILE macro) the
> gitmodules file path definition was centralized, AFAIU this was done
> mainly to prevent typos, as checking a symbolic constant is something
> the compiler will do for us.
+cc Brandon author of said patch.
Digging up the discussion, this was indeed only done to prevent typos.
> Expanding on that change the first patch in the series makes the path
> customizable exposing a 'core.submodulesFile' configuration setting.
I guess the similarity to core.ignoreFile is desired here. Although these
mechanisms are very different.
> The new configuration setting can be used to set an *alternative*
> location for the gitmodules file; IMHO there is no need to provide
> *additional* locations like in the case of exclude files.
I think there *may* be a need for additional files.
Currently there is only the .gitmodules file and the configuration
in .git/config overriding settings from .gitmodules.
There was some discussion on the mailing list in the past, which
presented a intermediate layer in between these two places, in
a special ref, such that:
base is in .gitmodules
overwritten via refs/meta/submodules:.gitmodules
overwritten via the .git/config
The intermediate would be a config file that is tracked on another
ref. This (a) decouples main project history from submodule history
and (b) makes it easier to distribute as it is part of the repository.
For example (a) is desired if you dig up an old project and the
submodules have all moved from one git hosting provider to another.
Another example would be when you fork a project with submodules
and don't want to mess with the main history but you just want to
adjust the submodule URLs. That is possible with such an intermediate
For (b) you can imagine the fork that you want to distribute in your
community and you don't want to tell everyone to change the
submodule URLs, but instead you can provide them with a prepared
.gitmodules file, that they have to place into that special ref (which
can be done via fetching).
I digress as these ideas seem to be orthogonal to your patch series,
just FYI. prior discussion starting at:
I recall there was a better discussion even prior to that, but have no
> For instance vcsh could set the location to
> '~/.gitmodules.d/$VCSH_REPO_NAME' to avoid conflicts.
> Since the gitmodules file is meant to be checked in into the repository,
> the overridden file path should be relative to the work-tree; is there
> a way to enforce this constraint at run time (i.e. validate the config
> value), or is it enough to have it documented?
I think we'd want to check at run time, if we need this constraint.