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 22, 2006, 22:09 UTC
Message-ID
<7v3baj365g.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<Pine.LNX.4.64.0609180926590.4388@g5.osdl.org>
Linus Torvalds <torvalds@osdl.org> writes:
> It's entirely possible that the proper way to do branch deletion with 
> packed branches is to simply re-pack without the old branch, rather than 
> the negative branch model. I couldn't really decide.

After playing with branch deletion issues for some time, I started to think it would be a lot simpler if we do not mark a deleted branch with 0{40}.

I started rewriting git-branch in C, mostly reusing Kristian Høgsberg's patch but taking care of the reflog issue still left in the original thread:

    Subject: [PATCH] branch as a builtin (again)
    Date: Sun, 20 Aug 2006 17:22:18 -0400
    Message-ID: <59ad55d30608201422h4a6d40f7y7782212637380438@mail.gmail.com>

We need to take care of two funny cases around packed-ref in lock_ref_sha1_basic() where a creation of a new ref takes place. It needs to deal with two issues.

 * We should not allow frotz branch to be created when
   frotz/nitfol branch already exists (packed and pruned).
   Being able to create .git/refs/heads/frotz.lock file and
   being able to rename it to .git/refs/heads/frotz is not
   enough.  The other way around has the same problem.  So we
   would need to have a for_each_ref() to check if the ref being
   created is a prefix of an existing one or there is an
   existing one that is a prefix of the one being created.
 * When creating frotz branch, there may be a leftover
   .git/refs/heads/frotz/ directory on the filesystem.  If the
   directory is empty (or contains only empty subdirectories),
   we can rmdir recursively and make refs/heads/frotz file
   there.  Otherwise it means that a branch frotz/something
   still exists there, but the above prefix check should have
   taken care of it.  So in practice we should always be able to
   just do an equivalent of "rm -fr .git/refs/heads/frotz" when
   creating a frotz branch.

But the latter falls apart if we use 0{40} convention to mark a deleted branch. Removing .git/refs/heads/frotz/nitfol file which has 0{40} and creating .git/refs/heads/frotz file resurrects frotz/nitfol branch that is still packed. Not allowing frotz branch to be created only because we had deleted frotz/nitfol previously is not what we want either, so at that point we need to repack without frotz/nitfol anyway.

Which makes me think that we would better repack when removing any existing ref.

BTW, the second issue exists without packed ref; currently we cannot do

    git branch foo/bar
    git branch -d foo/bar
    git branch foo
Previous: Christian CouderNext: Christian Couder
Message 6 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.