提交 eafb4526 编写于 作者: J Junio C Hamano

do_one_ref(): null_sha1 check is not about broken ref

f8948e2f (remote prune: warn dangling symrefs, 2009-02-08) introduced a
more dangerous variant of for_each_ref() family that skips the check for
dangling refs, but it also made another unrelated check optional by
mistake.

The check to see if a ref points at 0{40} is not about brokenness, but is
about a possible future plan to represent a deleted ref by writing 40 "0"
in a loose ref when there is a stale version of the same ref already in
.git/packed-refs, so that we can implement deletion of a ref without
having to rewrite the packed refs file excluding the ref being deleted.

This check has to live outside of the conditional.
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 735c6744
...@@ -531,9 +531,10 @@ static int do_one_ref(const char *base, each_ref_fn fn, int trim, ...@@ -531,9 +531,10 @@ static int do_one_ref(const char *base, each_ref_fn fn, int trim,
{ {
if (strncmp(base, entry->name, trim)) if (strncmp(base, entry->name, trim))
return 0; return 0;
/* Is this a "negative ref" that represents a deleted ref? */
if (is_null_sha1(entry->sha1))
return 0;
if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) { if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
if (is_null_sha1(entry->sha1))
return 0;
if (!has_sha1_file(entry->sha1)) { if (!has_sha1_file(entry->sha1)) {
error("%s does not point to a valid object!", entry->name); error("%s does not point to a valid object!", entry->name);
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册