describe: catch unborn branch in describe_blob()

When describing a blob, we search for it by traversing from HEAD. We do this by feeding the name HEAD to setup_revisions(). But if we are on an unborn branch, this will fail with a confusing message: $ git describe $blob fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]' It is OK for this to be an error (we cannot find $blob in an empty traversal, so we'd eventually complain about that). But the error message could be more helpful. Let's resolve HEAD ourselves and pass the resolved object id to setup_revisions(). If resolving fails, then we can print a more useful message. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Aug 18, 2025 at 17:01 UTC c6478715a52b8f757e898e1d9f8f8d1732fafb24
2 files changed +15 -1
builtin/describe.c
+7 -1
@@ -518,10 +518,16 @@ static void describe_blob(const struct object_id *oid, struct strbuf *dst)
518 {
519 struct rev_info revs;
520 struct strvec args = STRVEC_INIT;
521 + struct object_id head_oid;
522 struct process_commit_data pcd = { *null_oid(the_hash_algo), oid, dst, &revs};
523
524 + if (repo_get_oid(the_repository, "HEAD", &head_oid))
525 + die(_("cannot search for blob '%s' on an unborn branch"),
526 + oid_to_hex(oid));
527 +
528 strvec_pushl(&args, "internal: The first arg is not parsed",
524 - "--objects", "--in-commit-order", "--reverse", "HEAD",
529 + "--objects", "--in-commit-order", "--reverse",
530 + oid_to_hex(&head_oid),
531 NULL);
532
533 repo_init_revisions(the_repository, &revs, NULL);
t/t6120-describe.sh
+8
@@ -415,6 +415,14 @@ test_expect_success 'describe an unreachable blob' '
415 test_grep "blob .$blob. not reachable from HEAD" actual
416 '
417
418 +test_expect_success 'describe blob on an unborn branch' '
419 + oldbranch=$(git symbolic-ref HEAD) &&
420 + test_when_finished "git symbolic-ref HEAD $oldbranch" &&
421 + git symbolic-ref HEAD refs/heads/does-not-exist &&
422 + test_must_fail git describe test-blob 2>actual &&
423 + test_grep "cannot search .* on an unborn branch" actual
424 +'
425 +
426 test_expect_success ULIMIT_STACK_SIZE 'name-rev works in a deep repo' '
427 i=1 &&
428 while test $i -lt 8000