git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Distinguishing FF vs non-FF updates in the reflog?

From
Jeff King <peff@peff.net>
Date
Mar 18, 2021, 19:47 UTC
Message-ID
<YFOuT6L0dsrCGTBk@coredump.intra.peff.net>
In-Reply-To
<CAFQ2z_MefCwiWdhs0buJv5Zok+nsgaOvUCcsSnfm_PP0WozZKA@mail.gmail.com>
On Wed, Mar 17, 2021 at 09:06:06PM +0100, Han-Wen Nienhuys wrote:
Show 5 quoted lines
> I'm working on some extensions to Gerrit for which it would be very
> beneficial if we could tell from the reflog if an update is a
> fast-forward or not: if we find a SHA1 in the reflog, and see there
> were only FF updates since, we can be sure that the SHA1 is reachable
> from the branch, without having to open packfiles and decode commits.

I left some numbers in another part of the thread, but IMHO performance isn't that compelling a reason to do this these days, if you are using commit-graphs.

Just walking the reflog might be _slightly_ faster, though not necessarily (it depends on whether the depth of the object graph or the depth of the reflog chain is deeper). It might matter more if you are using a more exotic storage scheme, where switching from accessing reflogs to objects implies extra round-trips to a server (e.g., custom storage backends with JGit; I don't know the state of the art in what Google is doing there).

Show 9 quoted lines
> For the reftable format, I think we could store this easily by
> introducing more record types. Today we have 0 = deletion, 1 = update,
> and we could add 2 = FF update, 3 = non-FF update.
> 
> However, the textual reflog format doesn't easily allow for this.
> However, we might add a convention, eg. have the message start with
> 'FF' or 'NFF' depending on the nature of the update.
> 
> Does this make sense, and if yes is it worth proposing a change?

At GitHub we do something similar. We don't generally use reflogs much at all, but we keep a custom "audit log": a single append-only file that records every ref update in the repository. And its format just happens to be one reflog entry per line, prefixed by the updated ref.

And there we do generally annotate the FF-ness of an update by stuffing it into the free-form message field (in fact, we shove in a small JSON object, so we record multiple fields like the pushing id, IP, etc).

But the main goal there isn't performance (and in fact we don't generally consult it for anything outside of debugging). The reason we record FF-ness is for later debugging or analysis. We don't prune from the audit log, and we don't consider it for reachability when we prune objects (since otherwise you'd never be able to prune anything!). So the objects sometimes aren't available later to compute, but we still want to know if the user did a force-push, etc.

I don't think that really applies to regular reflogs, because they do imply reachability (and they are not great for later analysis, because we may selectively expire unreachable entries).

-Peff
Previous: Jeff KingNext: Han-Wen Nienhuys
Message 10 of 19 in “Distinguishing FF vs non-FF updates in the reflog?”
  1. Han-Wen NienhuysMar 17, 2021
  2. Martin FickMar 17, 2021
  3. Han-Wen NienhuysMar 18, 2021
  4. Jeff KingMar 18, 2021
  5. Martin FickMar 18, 2021
  6. Han-Wen NienhuysMar 22, 2021
  7. Martin FickMar 22, 2021
  8. Martin FickMar 18, 2021
  9. Jeff KingMar 18, 2021
  10. Jeff KingMar 18, 2021
  11. Han-Wen NienhuysMar 22, 2021
  12. Jeff KingMar 26, 2021
  13. Ævar Arnfjörð BjarmasonMar 22, 2021
  14. Han-Wen NienhuysMar 22, 2021
  15. Ævar Arnfjörð BjarmasonMar 22, 2021
  16. Han-Wen NienhuysMar 22, 2021
  17. Ævar Arnfjörð BjarmasonMar 22, 2021
  18. Han-Wen NienhuysMar 22, 2021
  19. Junio C HamanoMar 22, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.