diff --git a/builtin/commit.c b/builtin/commit.c index 3767478c6d..2341a4b7f7 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -826,8 +826,22 @@ static int prepare_to_commit(const char *index_file, const char *prefix, if (get_sha1(parent, sha1)) commitable = !!active_nr; - else - commitable = index_differs_from(parent, 0); + else { + /* + * Unless the user did explicitly request a submodule + * ignore mode by passing a command line option we do + * not ignore any changed submodule SHA-1s when + * comparing index and parent, no matter what is + * configured. Otherwise we won't commit any + * submodules which were manually staged, which would + * be really confusing. + */ + int diff_flags = DIFF_OPT_OVERRIDE_SUBMODULE_CONFIG; + if (ignore_submodule_arg && + !strcmp(ignore_submodule_arg, "all")) + diff_flags |= DIFF_OPT_IGNORE_SUBMODULES; + commitable = index_differs_from(parent, diff_flags); + } } strbuf_release(&committer_ident); diff --git a/t/t7508-status.sh b/t/t7508-status.sh index e6483fcd42..d48006960e 100755 --- a/t/t7508-status.sh +++ b/t/t7508-status.sh @@ -1523,7 +1523,7 @@ EOF test_i18ngrep "^M. sm" output ' -test_expect_failure 'git commit -m will commit a staged but ignored submodule' ' +test_expect_success 'git commit -m will commit a staged but ignored submodule' ' git commit -uno -m message && git status -s --ignore-submodules=dirty >output && test_i18ngrep ! "^M. sm" output &&