Re: branch description

3 messages, 3 authors, 2016-06-15 · open the first message on its own page

Re: branch description

From: Michael Dressel <hidden>
Date: 2016-06-15 22:44:31

On Friday 18 April 2008, Jakub Narebski wrote:
Let me sum up here proposals where to put branch description:
what's the opinion of having a new branch object? Actually the tag object 
probably already does the job? This would spoil the elegant light weight 
current branch references. But tags are not that heavy.

In this approach the tags would not reference commits but tags. And tags 
have annotation. The difference to the normal tags would be that these 
tags are referenced from refs/heads/<branch> instead of refs/tags.

I have no clue how involved this change would become and if the benefit 
would justify the effort. I guess using proper objects for branches 
would only be justified if additional advantages could be achieved.

Cheers,
 	Michael

Re: branch description

From: Johan Herland <hidden>
Date: 2016-06-15 22:44:31

On Tuesday 22 April 2008, Michael Dressel wrote:
On Friday 18 April 2008, Jakub Narebski wrote:
quoted
Let me sum up here proposals where to put branch description:
what's the opinion of having a new branch object? Actually the tag
object probably already does the job? This would spoil the elegant
light weight current branch references. But tags are not that heavy.

In this approach the tags would not reference commits but tags. And
tags have annotation. The difference to the normal tags would be that
these tags are referenced from refs/heads/<branch> instead of
refs/tags.

I have no clue how involved this change would become and if the
benefit would justify the effort. I guess using proper objects for
branches would only be justified if additional advantages could be
achieved.

Cheers,
 	Michael
Nice idea, but it won't work, simply because branches are moving
targets, whereas tags are not.

To illustrate, here's how things are structured between the refs
(tags/branches) and the object DB:


refs/tags/lighweight  -------------------------> [commit object]

refs/tags/annotated   -----> [tag object] -----> [commit object]

refs/heads/branchname -------------------------> [commit object]


The annotated tag ref holds the SHA1 of the tag object which in turn
holds the SHA1 of the commit object, while the two other ref types
point directly at a commit object. The tag object works on the
assumption that the commit object pointed to by the tag never changes.
That's after all the whole point of a tag.

A branch - on the other hand - is _supposed_ to change. It changes by
adding a new commit on top of the current commit, and updating the
branch ref to point to the new commit. If we kept the branch description
in a tag object, and stuck this between the branch ref and the commit
object, we would suddenly have to rewrite the tag object every time we
added another commit on the branch. This would make commits much more
expensive, not to mention that for every commit you would drop the
tag object pointing to the previous commit, in effect generating one
garbage object per commit. This is clearly not what we want.


...Johan

-- 
Johan Herland, [off-list ref]
www.herland.net

Re: branch description

From: Jakub Narebski <hidden>
Date: 2016-06-15 22:44:31

Michael Dressel [off-list ref] writes:
On Friday 18 April 2008, Jakub Narebski wrote:
quoted
Let me sum up here proposals where to put branch description:

[...]
what's the opinion of having a new branch object? Actually the tag
object probably already does the job? This would spoil the elegant
light weight current branch references. But tags are not that heavy.

In this approach the tags would not reference commits but tags. And
tags have annotation. The difference to the normal tags would be that
these tags are referenced from refs/heads/<branch> instead of
refs/tags.

I have no clue how involved this change would become and if the
benefit would justify the effort. I guess using proper objects for
branches would only be justified if additional advantages could be
achieved.
This won't work.  With described (annotated) branches, there are two
pieces of data associated with a branch:
 * commit it points to (branch head)
 * description of a branch

Branch head changes frequently (commit, reset, bisect, rebase), while
description should change rarely.  Those two pieces of data are
independent.  Tag object would unnecessary join/fuse those two
together.


Also, for exach commit on a branch, or for each moving of branch ref
(reset, amend, bisect), you would have to create tag object, which
would accumulate only to be garbage collected some time in the
future...

-- 
Jakub Narebski
Poland
ShadeHawk on #git
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help