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

Re: [PATCH] Remove branch by putting a null sha1 into the ref file.

From
Junio C Hamano <junkio@cox.net>
Date
Sep 23, 2006, 21:49 UTC
Message-ID
<7veju2nthl.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<200609231322.30214.chriscool@tuxfamily.org>
Christian Couder <chriscool@tuxfamily.org> writes:
> You are right, so what about moving ".git/refs/heads/frotz" 
> to ".git/deleted-refs/heads/frotz.ref" 
> or ".git/deleted-refs/heads/frotz~ref" (because "~" is forbidden in ref 
> names).

But wouldn't it bring up the issue of locking among deleters, updaters/creators, and traversers?

If we choose to use packed-refs.lock as the "set of all refs" lock, the whole sequence would become something like this. Note that this tries to make readers lockless but I am sure there are nasty race condition issues. I am not sure what we would want to do about them.

= Looking up a ref $frotz.
 - check if .git/$frotz exists, and use it if it does.
 - check if .git/deleted-refs/$frotz~ref exists, and return "no
   such ref" if it does.
 - find $frotz in .git/packed-refs.
= Looping over refs.
 - grab all .git/refs/ and subtract all .git/deleted-refs/
 - walk .git/packed-refs and the result from the above in
   parallel as in the current code.
= Storing a new value in ref $frotz.
 - acquire .git/packed-refs.lock
 - lock .git/$frotz.lock.
 - write into .git/$frotz.lock.
 - create or update .git/logs/$frotz as needed.
 - if .git/deleted-refs/$frotz~ref exists, unlink it.
 - rename .git/$frotz.lock to .git/$frotz to unlock it.
 - unlink .git/packed-refs.lock
= Deleting a ref $frotz.
 - acquire .git/packed-refs.lock
 - look up $frotz; if it does not exist either barf or return
   silent (haven't thought it through yet).
 - create .git/deleted-refs/$frotz~ref.
 - remove .git/logs/$frotz
 - unlink .git/packed-refs.lock
= Packing refs, with optional pruning.
 - lock .git/packed-refs.lock
 - loop over refs:
   - write it out to .git/packed-refs.lock unless a symref.
   - if it is a loose one (not a symref), remember it for pruning.
 - if pruning:
   - remove the entire .git/deleted-refs/ hierarchy
   - remove the remembered ones
 - rename .git/packed-refs.lock to .git/packed-refs
Previous: Christian CouderNext: Christian Couder
Message 10 of 19 in “Remove branch by putting a null sha1 into the ref file.”
  1. Remove branch by putting a null sha1 into the ref file.Christian Couder, Sep 18, 2006
  2. Junio C HamanoSep 18, 2006
  3. Linus TorvaldsSep 18, 2006
  4. Junio C HamanoSep 18, 2006
  5. Christian CouderSep 20, 2006
  6. Junio C HamanoSep 22, 2006
  7. Christian CouderSep 23, 2006
  8. Junio C HamanoSep 23, 2006
  9. Christian CouderSep 23, 2006
  10. Junio C HamanoSep 23, 2006
  11. Christian CouderSep 24, 2006
  12. On ref lockingJunio C Hamano, Sep 25, 2006
  13. Daniel BarkalowSep 25, 2006
  14. Junio C HamanoSep 26, 2006
  15. 1/3 Clean-up lock-ref implementationJunio C Hamano, Sep 26, 2006
  16. 2/3 update-ref: -d flag and ref creation safety.Junio C Hamano, Sep 26, 2006
  17. 3/3 update a few Porcelain-ish for ref lock safety.Junio C Hamano, Sep 26, 2006
  18. Andy WhitcroftSep 26, 2006
  19. Junio C HamanoSep 27, 2006

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.