diff --git a/src/libfetchers/git.cc b/src/libfetchers/git.cc index f8d89ab2fcd..a4fd6975c13 100644 --- a/src/libfetchers/git.cc +++ b/src/libfetchers/git.cc @@ -529,7 +529,13 @@ struct GitInputScheme : InputScheme if (input.getRev()) { try { runProgram("git", true, { "-C", repoDir, "--git-dir", gitDir, "cat-file", "-e", input.getRev()->gitRev() }); - doFetch = false; + auto res = runProgram("git", true, { "-C", repoDir, "--git-dir", gitDir, "for-each-ref", fmt("--contains=%s", input.getRev()->gitRev()) }); + if ( res == "" ) { + printTalkative("Rev %s was not associated with any ref (possibly due to an incomplete fetch) - performing a fetch", input.getRev()->gitRev(), actualUrl); + doFetch = true; + } else { + doFetch = false; + } } catch (ExecError & e) { if (WIFEXITED(e.status)) { doFetch = true; @@ -630,7 +636,7 @@ struct GitInputScheme : InputScheme // everything to ensure we get the rev. Activity act(*logger, lvlTalkative, actUnknown, fmt("making temporary clone of '%s'", repoDir)); runProgram("git", true, { "-C", tmpDir, "fetch", "--quiet", "--force", - "--update-head-ok", "--", repoDir, "refs/*:refs/*" }, {}, true); + "--update-head-ok", "--", repoDir, "refs/*:refs/*", input.getRev()->gitRev() }, {}, true); } runProgram("git", true, { "-C", tmpDir, "checkout", "--quiet", input.getRev()->gitRev() });