Skip to content

Commit 84ba959

Browse files
stefanbellergitster
authored andcommitted
submodule: fix regression for deinit without submodules
Per Cederqvist wrote: > It used to be possible to run > > git submodule deinit -f . > > to remove any submodules, no matter how many submodules you had. That > is no longer possible in projects that don't have any submodules at > all. The command will fail with: > > error: pathspec '.' did not match any file(s) known to git. This regression was introduced in 74703a1 (submodule: rewrite `module_list` shell function in C, 2015-09-02), as we changed the order of checking in new module listing to first check whether it is a gitlin before feeding it to match_pathspec(). It used to be that a pathspec that does not match any path were diagnosed as an error, but the new code complains for a pathspec that does not match any submodule path. Arguably the new behaviour may give us a better diagnosis, but that is inconsistent with the suggestion "deinit" gives, and also this was an unintended accident. The new behaviour hopefully can be redesigned and implemented better in future releases, but for now, switch these two checks to restore the same behavior as before. In an empty repository, giving the pathspec '.' will still get the same "did not match" error, but that is the same bug we had before 1.7.0. Reported-by: Per Cederqvist <[email protected]> Signed-off-by: Stefan Beller <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 2b56bb7 commit 84ba959

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

builtin/submodule--helper.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ static int module_list_compute(int argc, const char **argv,
3737
for (i = 0; i < active_nr; i++) {
3838
const struct cache_entry *ce = active_cache[i];
3939

40-
if (!S_ISGITLINK(ce->ce_mode) ||
41-
!match_pathspec(pathspec, ce->name, ce_namelen(ce),
42-
0, ps_matched, 1))
40+
if (!match_pathspec(pathspec, ce->name, ce_namelen(ce),
41+
0, ps_matched, 1) ||
42+
!S_ISGITLINK(ce->ce_mode))
4343
continue;
4444

4545
ALLOC_GROW(list->entries, list->nr + 1, list->alloc);

t/t7400-submodule-basic.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,19 @@ test_expect_success 'set up a second submodule' '
849849
git commit -m "submodule example2 added"
850850
'
851851

852+
test_expect_success 'submodule deinit works on repository without submodules' '
853+
test_when_finished "rm -rf newdirectory" &&
854+
mkdir newdirectory &&
855+
(
856+
cd newdirectory &&
857+
git init &&
858+
>file &&
859+
git add file &&
860+
git commit -m "repo should not be empty"
861+
git submodule deinit .
862+
)
863+
'
864+
852865
test_expect_success 'submodule deinit should remove the whole submodule section from .git/config' '
853866
git config submodule.example.foo bar &&
854867
git config submodule.example2.frotz nitfol &&

0 commit comments

Comments
 (0)