Thread (3 messages) flat view 3 messages, 3 authors, 2016-06-15

Re: [PATCH] builtin-branch - allow deleting a fully specified branch-name

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:46:35

Mark Levedahl [off-list ref] writes:
On Thursday 09 April 2009 20:39:46 Junio C Hamano wrote:
quoted
Mark Levedahl [off-list ref] writes:
quoted
This change allows, for instance
	git branch -d refs/heads/foo
to succeed. Without this patch, the code just assumes that the
given branch name should be appended to "refs/heads" or
"refs/remotes", thus attempting (and failing) in the above case
to delete "refs/heads/refs/heads/foo"
Your logic is broken.

Why doesn't the user simply say "git branch -d foo"?  The command takes
"the branch name", not "arbitrary ref name".
1) git branch -d refs/<whatever> used to work,  I haven't bisected to find 
when this stopped working, but the change broke one of my scripts, so this is 
not new behavior, it is restoration of previous behavior.
I need to look at the history, if that is the case then perhaps Ok.
2) If I create branch  refs/frotz/bar , how do I ever delete it?
By this you must mean .git/refs/heads/refs/frotz/bar, right?  Then
shouldn't "git branch -d refs/frotz/bar" just work as is?  If you are
talking about .git/refs/frotz/bar, "git branch" should not touch it, it is
not even a branch.
Also, the following all work
3) git branch refs/heads/foo
4) git branch -m refs/heads/foo refs/heads/bar 
If you mean it creates .git/refs/heads/refs/heads/foo, then sure it
should.  If it creates .git/refs/heads/foo, I think it is broken.
5) git  [checkout|pull|push|fetch|show] refs/heads/foo
Among these, checkout is the only special case that can take "branch name"
to switch branches.  Everything else takes extended SHA-1 expression.
Checkout can interpret the first argument as "branch to switch to", but it
does not necessarily so---think "detached HEAD", and also think "checking
out paths out of tree-ish".
So, why is "git branch -d" so special?
"git branch -d", "git branch -m" and friends all take branch name, and as
such it can use "@{-1}" to _name_ 'the previous branch".  In that context,
you are _not_ naming the commit at the tip of the branch.  You are naming
the branch itself.

All other commands happen to take a branch name because that is just one
case of extended SHA-1 expression to name an object.  In that context, a
refname (which a branch name is a special case of) refers to the commit
pointed by it.  E.g.

        "git checkout HEAD~20 -- Makefile"
        "git show refs/heads/foo"
        "git show heads/foo"
        "git show foo"
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help