diff options
author | Jeff King <peff@peff.net> | 2015-03-20 14:43:17 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-03-20 12:41:41 -0700 |
commit | ea56c4e02fc1d5ce6a6b5083c284e32ffc6367e6 (patch) | |
tree | 2f43663edfae7795d729da1c00895bcfd8d22001 /t | |
parent | repack: turn on "ref paranoia" when doing a destructive repack (diff) | |
download | tgif-ea56c4e02fc1d5ce6a6b5083c284e32ffc6367e6.tar.xz |
refs.c: drop curate_packed_refs
When we delete a ref, we have to rewrite the entire
packed-refs file. We take this opportunity to "curate" the
packed-refs file and drop any entries that are crufty or
broken.
Dropping broken entries (e.g., with bogus names, or ones
that point to missing objects) is actively a bad idea, as it
means that we lose any notion that the data was there in the
first place. Aside from the general hackiness that we might
lose any information about ref "foo" while deleting an
unrelated ref "bar", this may seriously hamper any attempts
by the user at recovering from the corruption in "foo".
They will lose the sha1 and name of "foo"; the exact pointer
may still be useful even if they recover missing objects
from a different copy of the repository. But worse, once the
ref is gone, there is no trace of the corruption. A
follow-up "git prune" may delete objects, even though it
would otherwise bail when seeing corruption.
We could just drop the "broken" bits from
curate_packed_refs, and continue to drop the "crufty" bits:
refs whose loose counterpart exists in the filesystem. This
is not wrong to do, and it does have the advantage that we
may write out a slightly smaller packed-refs file. But it
has two disadvantages:
1. It is a potential source of races or mistakes with
respect to these refs that are otherwise unrelated to
the operation. To my knowledge, there aren't any active
problems in this area, but it seems like an unnecessary
risk.
2. We have to spend time looking up the matching loose
refs for every item in the packed-refs file. If you
have a large number of packed refs that do not change,
that outweighs the benefit from writing out a smaller
packed-refs file (it doesn't get smaller, and you do a
bunch of directory traversal to find that out).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't')
-rwxr-xr-x | t/t5312-prune-corruption.sh | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/t/t5312-prune-corruption.sh b/t/t5312-prune-corruption.sh index e8d04ef1bf..8e98b44083 100755 --- a/t/t5312-prune-corruption.sh +++ b/t/t5312-prune-corruption.sh @@ -105,7 +105,7 @@ test_expect_success 'pack-refs does not silently delete broken packed ref' ' test_cmp expect actual ' -test_expect_failure 'pack-refs does not drop broken refs during deletion' ' +test_expect_success 'pack-refs does not drop broken refs during deletion' ' git update-ref -d refs/heads/other && git rev-parse refs/heads/master >actual && test_cmp expect actual |