diff options
| author | K Jayatheerth <jayatheerthkulkarni2005@gmail.com> | 2025-07-24 20:54:17 +0530 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2025-07-24 13:35:07 -0700 |
| commit | 1fa06ceddf1ea01bd85e277471ba79330666f037 (patch) | |
| tree | ebbe33a18e7fa1bba4d0c34a4b1f59b7531bfb2c /t/t7400-submodule-basic.sh | |
| parent | The fifteenth batch (diff) | |
| download | git-1fa06ceddf1ea01bd85e277471ba79330666f037.tar.gz git-1fa06ceddf1ea01bd85e277471ba79330666f037.zip | |
submodule: prevent overwriting .gitmodules on path reuse
Adding a submodule at a path that previously hosted
another submodule (e.g., 'child') reuses the submodule
name derived from the path. If the original submodule
was only moved (e.g., to 'child_old') and not renamed,
this silently overwrites its configuration in .gitmodules.
This behavior loses user configuration and causes
confusion when the original submodule is expected
to remain intact. It assumes that the path-derived
name is always safe to reuse, even though the name
might still be in use elsewhere in the repository.
Teach module_add() to check if the computed submodule
name already exists in the repository's submodule config,
and if so, refuse the operation unless the user explicitly
renames the submodule or uses the --force option,
which will automatically generate a unique name by
appending a number (e.g., child1).
Signed-off-by: K Jayatheerth <jayatheerthkulkarni2005@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to '')
| -rwxr-xr-x | t/t7400-submodule-basic.sh | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh index d6a501d453..6812df3081 100755 --- a/t/t7400-submodule-basic.sh +++ b/t/t7400-submodule-basic.sh @@ -1482,4 +1482,26 @@ test_expect_success '`submodule init` and `init.templateDir`' ' ) ' +test_expect_success 'submodule add fails when name is reused' ' + git init test-submodule && + ( + cd test-submodule && + git commit --allow-empty -m init && + + git init ../child-origin && + git -C ../child-origin commit --allow-empty -m init && + + git submodule add ../child-origin child && + git commit -m "Add submodule child" && + + git mv child child_old && + git commit -m "Move child to child_old" && + + # Now adding a *new* repo at the old name must fail + git init ../child2-origin && + git -C ../child2-origin commit --allow-empty -m init && + test_must_fail git submodule add ../child2-origin child + ) +' + test_done |
