Teach 'submodule_has_commits()' to ensure that if a commit exists in a submodule, that it is also reachable from a ref. This is a prepritory step prior to merging the logic which checkes for changed submodules when fetching or pushing. Signed-off-by: Brandon Williams <bmwill@xxxxxxxxxx> --- submodule.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/submodule.c b/submodule.c index 3bcf44521..100d31d39 100644 --- a/submodule.c +++ b/submodule.c @@ -648,6 +648,30 @@ static int submodule_has_commits(const char *path, struct oid_array *commits) return 0; oid_array_for_each_unique(commits, check_has_commit, &has_commit); + + if (has_commit) { + /* + * Even if the submodule is checked out and the commit is + * present, make sure it is reachable from a ref. + */ + struct child_process cp = CHILD_PROCESS_INIT; + struct strbuf out = STRBUF_INIT; + + argv_array_pushl(&cp.args, "rev-list", "-n", "1", NULL); + oid_array_for_each_unique(commits, append_oid_to_argv, &cp.args); + argv_array_pushl(&cp.args, "--not", "--all", NULL); + + prepare_submodule_repo_env(&cp.env_array); + cp.git_cmd = 1; + cp.no_stdin = 1; + cp.dir = path; + + if (capture_command(&cp, &out, 1024) || out.len) + has_commit = 0; + + strbuf_release(&out); + } + return has_commit; } -- 2.13.0.rc0.306.g87b477812d-goog