aboutsummaryrefslogtreecommitdiff
path: root/Documentation
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2026-02-05 15:41:58 -0800
committerJunio C Hamano <gitster@pobox.com>2026-02-05 15:41:58 -0800
commitc3a5261dc0e726b5d8ee6309afcad9d431a4b50c (patch)
tree5fdb722abc1386c1afa6d79a059c9d7234287b0e /Documentation
parentae78735c4b69d58e1de1e3df3bd0adabb3206d7e (diff)
parente897c9b7f31cf83e93cfefe1f82eb4a18337c9b1 (diff)
downloadgit-c3a5261dc0e726b5d8ee6309afcad9d431a4b50c.tar.xz
Merge branch 'ar/submodule-gitdir-tweak'
Avoid local submodule repository directory paths overlapping with each other by encoding submodule names before using them as path components. * ar/submodule-gitdir-tweak: submodule: detect conflicts with existing gitdir configs submodule: hash the submodule name for the gitdir path submodule: fix case-folding gitdir filesystem collisions submodule--helper: fix filesystem collisions by encoding gitdir paths builtin/credential-store: move is_rfc3986_unreserved to url.[ch] submodule--helper: add gitdir migration command submodule: allow runtime enabling extensions.submodulePathConfig submodule: introduce extensions.submodulePathConfig builtin/submodule--helper: add gitdir command submodule: always validate gitdirs inside submodule_name_to_gitdir submodule--helper: use submodule_name_to_gitdir in add_submodule
Diffstat (limited to 'Documentation')
-rw-r--r--Documentation/config/extensions.adoc29
-rw-r--r--Documentation/config/init.adoc6
-rw-r--r--Documentation/config/submodule.adoc7
3 files changed, 42 insertions, 0 deletions
diff --git a/Documentation/config/extensions.adoc b/Documentation/config/extensions.adoc
index 532456644b..2aef3315b1 100644
--- a/Documentation/config/extensions.adoc
+++ b/Documentation/config/extensions.adoc
@@ -73,6 +73,35 @@ relativeWorktrees:::
repaired with either the `--relative-paths` option or with the
`worktree.useRelativePaths` config set to `true`.
+submodulePathConfig:::
+ This extension is for the minority of users who:
++
+--
+* Encounter errors like `refusing to create ... in another submodule's git dir`
+ due to a number of reasons, like case-insensitive filesystem conflicts when
+ creating modules named `foo` and `Foo`.
+* Require more flexible submodule layouts, for example due to nested names like
+ `foo`, `foo/bar` and `foo/baz` not supported by the default gitdir mechanism
+ which uses `.git/modules/<plain-name>` locations, causing further conflicts.
+--
++
+When `extensions.submodulePathConfig` is enabled, the `submodule.<name>.gitdir`
+config becomes the single source of truth for all submodule gitdir paths and is
+automatically set for all new submodules both during clone and init operations.
++
+Git will error out if a module does not have a corresponding
+`submodule.<name>.gitdir` set.
++
+Existing (pre-extension) submodules need to be migrated by adding the missing
+config entries. This can be done manually, e.g. for each submodule:
+`git config submodule.<name>.gitdir .git/modules/<name>`, or via the
+`git submodule--helper migrate-gitdir-configs` command which iterates over all
+submodules and attempts to migrate them.
++
+The extension can be enabled automatically for new repositories by setting
+`init.defaultSubmodulePathConfig` to `true`, for example by running
+`git config --global init.defaultSubmodulePathConfig true`.
+
worktreeConfig:::
If enabled, then worktrees will load config settings from the
`$GIT_DIR/config.worktree` file in addition to the
diff --git a/Documentation/config/init.adoc b/Documentation/config/init.adoc
index e45b2a8121..7b4abdaf8b 100644
--- a/Documentation/config/init.adoc
+++ b/Documentation/config/init.adoc
@@ -18,3 +18,9 @@ endif::[]
See `--ref-format=` in linkgit:git-init[1]. Both the command line
option and the `GIT_DEFAULT_REF_FORMAT` environment variable take
precedence over this config.
+
+init.defaultSubmodulePathConfig::
+ A boolean that specifies if `git init` and `git clone` should
+ automatically set `extensions.submodulePathConfig` to `true`. This
+ allows all new repositories to automatically use the submodule path
+ extension. Defaults to `false` when unset.
diff --git a/Documentation/config/submodule.adoc b/Documentation/config/submodule.adoc
index 0672d99117..74f1659a91 100644
--- a/Documentation/config/submodule.adoc
+++ b/Documentation/config/submodule.adoc
@@ -52,6 +52,13 @@ submodule.<name>.active::
submodule.active config option. See linkgit:gitsubmodules[7] for
details.
+submodule.<name>.gitdir::
+ This sets the gitdir path for submodule <name>. This configuration is
+ respected when `extensions.submodulePathConfig` is enabled, otherwise it
+ has no effect. When enabled, this config becomes the single source of
+ truth for submodule gitdir paths and Git will error if it is missing.
+ See linkgit:git-config[1] for details.
+
submodule.active::
A repeated field which contains a pathspec used to match against a
submodule's path to determine if the submodule is of interest to git