> Kyle Meyer <kyle@xxxxxxxxxx> writes: > > [...] > >> diff --git a/git-submodule.sh b/git-submodule.sh >> index 514ede2596..6c74656027 100755 >> --- a/git-submodule.sh >> +++ b/git-submodule.sh >> @@ -234,10 +234,18 @@ cmd_add() >> if test -z "$force" && >> ! git add --dry-run --ignore-missing --no-warn-embedded-repo "$sm_path" > /dev/null 2>&1 >> then >> - eval_gettextln "The following path is ignored by one of your .gitignore files: >> + if test -d "$sm_path" && >> + test -z $(git -C "$sm_path" rev-parse --show-cdup 2>/dev/null) && >> + ! git -C "$sm_path" rev-parse --verify -q HEAD >/dev/null >> + then >> + die "$(eval_gettext "'\$sm_path' does not have any commits")" >> + else >> + eval_gettextln "\ >> +The following path is ignored by one of your .gitignore files: >> \$sm_path >> Use -f if you really want to add it." >&2 >> - exit 1 >> + exit 1 >> + fi > > I didn't think through this check, which would have been obvious had I > ran the added test without the rest of the patches in this series. It > assumes that the 'git add --dry-run' call fails, but that failure > depends on the last patch of this series. So I'd need to move this > patch to the end or find a new place for this "no commits" check. v2 moves the "no commits" check outside of the 'git add --dry-run' failure condition so that the first patch doesn't depend on the final patch in this series. Kyle Meyer (4): submodule: refuse to add repository with no commits t3000: move non-submodule repo test to separate file t3009: test that ls-files -o traverses bogus repo dir: do not traverse repositories with no commits dir.c | 6 ++- git-submodule.sh | 7 ++++ t/t3000-ls-files-others.sh | 7 ---- t/t3009-ls-files-others-nonsubmodule.sh | 56 +++++++++++++++++++++++++ t/t3700-add.sh | 1 + t/t7400-submodule-basic.sh | 11 ++++- 6 files changed, 78 insertions(+), 10 deletions(-) create mode 100755 t/t3009-ls-files-others-nonsubmodule.sh Range-diff against v1: 1: e0db7e3c3c ! 1: b080e2c557 submodule: refuse to add repository with no commits @@ -9,10 +9,9 @@ in the sub-repository are added to the current repository. Detect if the path is a repository with no commits and abort to avoid - getting into this state unless --force is used. Reacting to --force - isn't very useful, especially because an upcoming commit will make - 'git add' fail in this situation, but it allows us to use the same - 'git add --dry-run' condition as the ignored path case. + getting into this state. Note that this check must come before the + 'git add --dry-run' check because an upcoming commit will make 'git + add' fail in this situation. Signed-off-by: Kyle Meyer <kyle@xxxxxxxxxx> @@ -20,26 +19,19 @@ --- a/git-submodule.sh +++ b/git-submodule.sh @@ + die "$(eval_gettext "'\$sm_path' already exists in the index and is not a submodule")" + fi + ++ if test -d "$sm_path" && ++ test -z $(git -C "$sm_path" rev-parse --show-cdup 2>/dev/null) ++ then ++ git -C "$sm_path" rev-parse --verify -q HEAD >/dev/null || ++ die "$(eval_gettext "'\$sm_path' does not have any commits")" ++ fi ++ if test -z "$force" && ! git add --dry-run --ignore-missing --no-warn-embedded-repo "$sm_path" > /dev/null 2>&1 then -- eval_gettextln "The following path is ignored by one of your .gitignore files: -+ if test -d "$sm_path" && -+ test -z $(git -C "$sm_path" rev-parse --show-cdup 2>/dev/null) && -+ ! git -C "$sm_path" rev-parse --verify -q HEAD >/dev/null -+ then -+ die "$(eval_gettext "'\$sm_path' does not have any commits")" -+ else -+ eval_gettextln "\ -+The following path is ignored by one of your .gitignore files: - \$sm_path - Use -f if you really want to add it." >&2 -- exit 1 -+ exit 1 -+ fi - fi - - if test -n "$custom_name" diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh --- a/t/t7400-submodule-basic.sh 2: 6eed1f5daf = 2: c027701842 t3000: move non-submodule repo test to separate file 3: 7ba3209762 = 3: 97f53e30c0 t3009: test that ls-files -o traverses bogus repo 4: 2901375dc1 = 4: a926b87102 dir: do not traverse repositories with no commits -- 2.21.0