archive mirror
 help / color / mirror / Atom feed
From: Josh Triplett <>
Subject: gc and repack ignore .git/*HEAD when checking reachability
Date: Thu, 7 Jul 2016 19:59:49 -0700	[thread overview]
Message-ID: <20160708025948.GA3226@x> (raw)

The manpage for git gc says:
> git gc tries very hard to be safe about the garbage it collects. In
> particular, it will keep not only objects referenced by your current
> set of branches and tags, but also objects referenced by the index,
> remote-tracking branches, refs saved by git filter-branch in
> refs/original/, or reflogs (which may reference commits in branches
> that were later amended or rewound).

gc, repack, and anything else that uses the machinery in reachable.c
will also check HEAD, to include objects only reachable from a detached
HEAD (which the manpage should document).

However, unreachable.c does not check any other ref that sits directly
in the .git directory, such as MERGE_HEAD, FETCH_HEAD, or
CHERRY_PICK_HEAD.  To test this, try creating a new empty repository
with "git init repo ; cd repo", then use "git fetch URL" to fetch a
repository into FETCH_HEAD, then run "git repack -a -d -f", and then
"git show FETCH_HEAD".  This similarly affects "git gc", which will
unpack all the objects from the pack and leave them loose.

This could result in data loss, if a user expected that having an object
referenced from those places would protect it from pruning.

I think the right fix for this would involve having
mark_reachable_objects in reachable.c add all refs that match
.git/*HEAD, not just .git/HEAD itself.  (I'd suggest matching .git/*HEAD
rather than hardcoding the list of "special" refs, to provide
compatibility with any other tool or future version of git that
introduces another such ref.)  This seems fairly easily done with a new
variant of do_head_ref that includes all such refs, along with a
one-line change to mark_reachable_objects to use it.

Does this seem like a reasonable approach?

- Josh Triplett

             reply	other threads:[~2016-07-08  3:00 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-08  2:59 Josh Triplett [this message]
2016-07-08  4:34 ` Junio C Hamano
2016-07-08  6:44   ` Josh Triplett
2016-07-08 17:14     ` Junio C Hamano
2016-07-08 19:25       ` Theodore Ts'o
2016-07-08 20:30         ` Junio C Hamano
2016-07-08 23:50           ` Theodore Ts'o
2016-07-09  5:23             ` Josh Triplett
2016-07-08 20:29       ` Josh Triplett
2016-07-09  7:35       ` Johannes Schindelin
2016-07-09 14:09         ` Josh Triplett
2016-07-09 16:45           ` Duy Nguyen
2016-07-10 10:59             ` Johannes Schindelin
2016-07-10 11:04               ` Duy Nguyen
2016-07-10 14:16                 ` Johannes Schindelin
2016-07-10 15:01                   ` Duy Nguyen
2016-07-11  6:07                     ` Johannes Schindelin
2016-07-11 18:52                   ` Junio C Hamano
2016-07-12 10:47                     ` Johannes Schindelin
2016-07-12 15:26                       ` Jeff King
2016-07-12 15:46                         ` Duy Nguyen
2016-07-12 15:51                           ` Jeff King
2016-07-12 16:13                             ` Duy Nguyen
2016-07-13  8:20                               ` Johannes Schindelin
2016-07-13 14:54                                 ` Duy Nguyen
2016-07-13 18:59                                   ` Johannes Schindelin
2016-07-15 15:46                                     ` Duy Nguyen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160708025948.GA3226@x \ \ \
    --subject='Re: gc and repack ignore .git/*HEAD when checking reachability' \

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).