Re: [PATCH] logging branch deletion to help recovering from mistakes
- From
Shawn Pearce <spearce@spearce.org>
- Date
- Dec 7, 2010, 18:14 UTC
- Message-ID
- <AANLkTimnp3xCHp_3E7ry-5OQL3PFnYh=H8PhfzMN307C@mail.gmail.com>
- In-Reply-To
- <20101207170623.GB21749@sigill.intra.peff.net>
On Tue, Dec 7, 2010 at 9:06 AM, Jeff King <peff@peff.net> wrote:
Show 16 quoted lines
> On Mon, Dec 06, 2010 at 10:28:53PM -0800, Junio C Hamano wrote: > >> > Should this special log be mentioned in git-update-ref.txt or >> > gitrepository-layout.txt? >> >> Perhaps, but I wasn't sure if this patch itself is a good idea to begin >> with. Not the problem it tries to solve, but its approach. >> >> For example, this cannot be shown with "reflog show" or "log -g" due to >> the way these frontends locate the reflog file to read (the logic wants to >> have an underlying ref). > > Yeah, I think this is not _quite_ what people want in this area. A base > requirement from past discussions, I think, is that the whole reflog of > the deleted branch be saved rather than just the tip. And then "reflog > show" would make a lot more sense on such saved reflogs.
Yup, that's what I recall too, folks (including myself) want to save the reflog of the deleted branch, so it can be recovered if the branch itself were to be recovered with an --undelete option.
Show 12 quoted lines
> I'm not sure in practice how important that distinction is, as we are > not saving deleted branch reflogs _at all_ right now, so the > requirements are mostly speculation at this point. > > The most recent discussion I recall is this one: > > http://thread.gmane.org/gmane.comp.version-control.git/144250/focus=145353 > > where the general idea was to just keep deleted reflogs around, append > to them if the branch was recreated, and use a consistent renaming > scheme to avoid D/F naming conflicts (e.g., "foo" is a deleted ref, and > you create "foo/bar").
Per check-ref-format, ref names cannot contain two dots. We could archive ref logs by renaming them, $GIT_DIR/logs/refs/heads/foo becomes $GIT_DIR/logs/refs/heads/foo..deleted-1. If foo is created and deleted again, it becomes foo..deleted-2.
This still causes problems for git reflog show / git log -g because they want a current ref to enumerate the log of.
A different approach might be to have $GIT_DIR/logs/refs/REF_ATTIC, and special case that in git reflog show / git log -g. When a ref is deleted, append its entire log onto REF_ATTIC, between two specially formatted marker lines. When recovering a branch, copy out the region from the REF_ATTIC log.
-- Shawn.