git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Subversion-style incrementing revision numbers
@ 2006-09-19 21:07 Joel Dice
  2006-09-19 21:18 ` Petr Baudis
                   ` (3 more replies)
  0 siblings, 4 replies; 28+ messages in thread
From: Joel Dice @ 2006-09-19 21:07 UTC (permalink / raw)
  To: git

Hello, all.

I'm considering adopting Git for a medium-sized project which is currently 
managed using Subversion.  I've used Git for a few smaller projects 
already, and the thing I've missed most from Subversion is the convenience 
of incrementing revision numbers.  The following is a proposal to add this 
feature to Git.


Rationale:

Incrementing revision numbers (IRNs - an acronym I just made up) are 
useful in that they can be treated as auto-generated tags which are easier 
to remember and communicate than SHA hashes, yet do not require extra 
effort to create like real tags.  Also, they have the advantage of being 
chronologically ordered, so if I assert that a bug was fixed in revision 
42 of a shared repository, everyone may assume that revision 45 has that 
fix as well.

Proposal:

As with Subversion, the IRN state in Git would be specific to a given 
repository and have no significance beyond that repository.  Also like 
Subversion, IRN state would be global across a repository, so that a 
commit to any branch would increment the current IRN value.  Every Git 
command taking a revision parameter would accept an IRN using a syntax 
such as "r$IRN".  Every commit would report the IRN to the user as well as 
the SHA ID.  The IRN feature could be enabled or disabled via a 
configuration option.

Implementation:

A simple, efficient implementation of this feature would be based on a 
single file, $GIT_DIR/history, which would contain a newline-delimited 
list of SHA commit IDs in chronological order, oldest first.  The current 
repository IRN would be calculated as the size of that file divided by the 
SHA+newline length, and the commit ID of any IRN could be determined by 
seeking to the correct offset in that file.  Every commit would cause a 
new line to be appended to the history file with that commit's ID. 
Finally, a history file could be generated for an existing repository by 
serializing the commit history based on chronological order.


I'd be happy to put together a patch that implements this, but first I'd 
like to get some feedback.  If something like this has already been 
proposed, please point me to the discussion.  Thanks.

  - Joel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 21:07 Subversion-style incrementing revision numbers Joel Dice
@ 2006-09-19 21:18 ` Petr Baudis
  2006-09-19 21:42   ` Joel Dice
  2006-09-19 21:58   ` Jakub Narebski
  2006-09-19 21:51 ` Linus Torvalds
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 28+ messages in thread
From: Petr Baudis @ 2006-09-19 21:18 UTC (permalink / raw)
  To: Joel Dice; +Cc: git

Dear diary, on Tue, Sep 19, 2006 at 11:07:45PM CEST, I got a letter
where Joel Dice <dicej@mailsnare.net> said that...
> Implementation:
> 
> A simple, efficient implementation of this feature would be based on a 
> single file, $GIT_DIR/history, which would contain a newline-delimited 
> list of SHA commit IDs in chronological order, oldest first.  The current 
> repository IRN would be calculated as the size of that file divided by the 
> SHA+newline length, and the commit ID of any IRN could be determined by 
> seeking to the correct offset in that file.  Every commit would cause a 
> new line to be appended to the history file with that commit's ID. 
> Finally, a history file could be generated for an existing repository by 
> serializing the commit history based on chronological order.

We already have support for recording something similar, it's called a
revlog. You would just need to modify it to aggregate all the branches
in a single file.

Also, multiple IRNs could refer to a single real commit if you do e.g.
cg-admin-uncommit, since revlog logs revision updates, not new revisions
created. This may or may not be considered a good thing. If you rather
want to just create a new IRN at commit object creation time, also note
that some tools _might_ validly create commit objects and then throw
them away, which would generate non-sensical (and after prune, invalid)
IRNs.

-- 
				Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
Snow falling on Perl. White noise covering line noise.
Hides all the bugs too. -- J. Putnam

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 21:18 ` Petr Baudis
@ 2006-09-19 21:42   ` Joel Dice
  2006-09-19 22:00     ` Petr Baudis
  2006-09-19 22:39     ` Shawn Pearce
  2006-09-19 21:58   ` Jakub Narebski
  1 sibling, 2 replies; 28+ messages in thread
From: Joel Dice @ 2006-09-19 21:42 UTC (permalink / raw)
  To: Petr Baudis; +Cc: git

On Tue, 19 Sep 2006, Petr Baudis wrote:

> Dear diary, on Tue, Sep 19, 2006 at 11:07:45PM CEST, I got a letter
> where Joel Dice <dicej@mailsnare.net> said that...
>> Implementation:
>>
>> A simple, efficient implementation of this feature would be based on a
>> single file, $GIT_DIR/history, which would contain a newline-delimited
>> list of SHA commit IDs in chronological order, oldest first.  The current
>> repository IRN would be calculated as the size of that file divided by the
>> SHA+newline length, and the commit ID of any IRN could be determined by
>> seeking to the correct offset in that file.  Every commit would cause a
>> new line to be appended to the history file with that commit's ID.
>> Finally, a history file could be generated for an existing repository by
>> serializing the commit history based on chronological order.
>
> We already have support for recording something similar, it's called a
> revlog. You would just need to modify it to aggregate all the branches
> in a single file.

Thanks - I'll look at that.

> Also, multiple IRNs could refer to a single real commit if you do e.g.
> cg-admin-uncommit, since revlog logs revision updates, not new revisions
> created. This may or may not be considered a good thing. If you rather
> want to just create a new IRN at commit object creation time, also note
> that some tools _might_ validly create commit objects and then throw
> them away, which would generate non-sensical (and after prune, invalid)
> IRNs.

I'm not too worried about cg-admin-uncommit or git-reset, since the IRN 
feature is intended mainly for shared repositories.  I would suggest that 
such commands simply be disallowed for such repositories.

The problem of temporary commits certainly needs to be addressed.  In this 
case, may I assume nothing under $GIT_DIR/refs is ever modified?  If so, 
perhaps I could somehow hook into the git-update-ref step.  Is that what 
the revlog code does?

  - Joel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 21:07 Subversion-style incrementing revision numbers Joel Dice
  2006-09-19 21:18 ` Petr Baudis
@ 2006-09-19 21:51 ` Linus Torvalds
  2006-09-19 22:06   ` Petr Baudis
  2006-09-19 22:07 ` Jakub Narebski
  2006-09-19 22:09 ` Shawn Pearce
  3 siblings, 1 reply; 28+ messages in thread
From: Linus Torvalds @ 2006-09-19 21:51 UTC (permalink / raw)
  To: Joel Dice; +Cc: git



On Tue, 19 Sep 2006, Joel Dice wrote:
> 
> I'd be happy to put together a patch that implements this, but first I'd like
> to get some feedback.  If something like this has already been proposed,
> please point me to the discussion.  Thanks.

I really don't think you can do it sanely.

The thing is, the reason subversion can do it is simply that SVN is 
terminally broken.

Really. SVN is crap. It may be prettier crap than CVS, but it's literaly 
no different from putting confectioners sugar on top of a cowpatty. It's 
not really "fixing" anything. And the revision numbering is actually very 
much part of the problem.

The thing is, you can limit yourself to a single repository, and once you 
have branches, you _still_ cannot sanely number the commits with anything 
like "r1.3.4.1".

Here's an example. Let's say that you start out with just a regular 
"master" branch, and you number the commits "r1.1", "r1.2" and so on (of 
course, that extra "1." at the beginning doesn't actually make any 
_sense_, but let's keep it just to not confuse CVS/SVN users any more than 
they are already confused).

Now, you've done five commits, and are at "r1.5", and everything looks 
beautiful, and you're getting comfy, so you start and check out a branch 
called "test". What do you call it?

The thing is, you need to call it "r1.5", because the _commit_ is still 
exactly the same as the master one. Creation of a branch in git doesn't 
actually create any new commits, it just creates a new pointer. 

So far so fine. We can ignore that, and make the rules be:

 - when creating a commit, we look at the branch name. If the branch name 
   is "master", we increment the second number, and drop all other 
   numbers.

 - if the branch name is anything else, we look whether the current state 
   is the same any other branch, in which case we just add a ".1" at the 
   end relative to the branch (or a ".2" if a ".1" already exists and so 
   on). Otherwise we increment the last number.

that's not a wonderful set of rules, but it might work. So what happens is 
that when we create the next commit (on the "test" branch), that commit 
will be called "r1.5.1" (which is what you'd expect). Go along a bit, and 
you get "r1.5.2" and "r1.5.3" too. Wonderful.

Now you decide to merge this back into "master". Which, btw, hasn't had 
any actual development happen, so it's stil at 1.5. You check out "master" 
and do a "git pull . test" (or "git pull . r1.5.3", which is obviously the 
same thing), and what happens?

That's right, we now fast-forward master to that revision, since nothing 
happened on master. Which means that your master branch is now comprised 
of revisions "r1.1" .. "r1.5" "r1.5.1" .. "r1.5.3". That makes no sense at 
all, but it works. The next commit would be called "r1.6".

In other words, the SVN numbering is just insane in a git repo, although 
you can "make it work" in a limited sense (but the numbering would jump in 
odd ways. The thing is, all the things that are true in a distributed 
environment are true in a single repository too, so limiting yourself to 
a single repo doesn't really make them go away.

Another thing you CAN do, is to just number them in time in a single repo. 
Every time you do a commit, you can create a "r1.<n+1>" revision, and that 
would work. It wouldn't look like the SVN numbers do, and it would only 
work _within_ that repository, but it would work.

But it would mean that "r1.57" is _not_ necessarily the child of "r1.56". 
It might be that "r1.56" was done on another branch, and is totally 
unrelated to "r1.57" (other than they sharing some common ancestor far 
back).

See? The SVN (and CVS) revision numbering really only makes sense because 
it's fundamentally a non-distributed model.

Git is so _fundamentally_ distributed that even within one single 
repository, each branch is totally independent ("distributed"). In 
CVS/SVN, branches aren't independent of each other, and that's why they 
show up in the revision numbering.

So you can really only number things as long as you never do any branches 
at all, and just do a linear development. In that case, and in that case 
only, does numbering work. Or you'd have to have a very "non-git" approach 
to branches (the above silly rules _can_ be used - possibly with some 
fixes - to give you essentially SVN-like revision numbers, if you _always_ 
generate a commit when you merge).

It doesn't seem to make a whole lot of sense, does it?

Btw, along the same issues, BK actually had RCS/CVS/SVN-like revision 
numbers, but to solve the distributed problem (BK didn't have branches) BK 
had a different approach.

So BK actually _did_ number things as "1.1" and "1.4.6" etc, and was 
obviously distributed, and the revision numbers actually matched the shape 
of the development history the same way CVS/SVN does. But if you do that, 
what happens is that a merge will _change_ the numbers: you may have 
started with two different branches that both were at "r1.2", but at the 
end of it one of them got renamed to "r1.1.1", and the final result was 
called "r1.3".

So if you allow malleable revision numbers, you can definitely do it. That 
ends up being _really_ confusing. I know a number of people who otherwise 
were smart really never understood why "r1.576" might not stay as "r1.576" 
forever, but might suddenly become "1.401.3.55" when merged into another 
repository.

Anyway, what I'm trying to say is that you're probably better off trying 
to get used to the git numbering than trying to force the SVN model. 
You're going to hit a few confusing issues if you really want to call 
things "r1.x.y.z"

			Linus

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 21:18 ` Petr Baudis
  2006-09-19 21:42   ` Joel Dice
@ 2006-09-19 21:58   ` Jakub Narebski
  1 sibling, 0 replies; 28+ messages in thread
From: Jakub Narebski @ 2006-09-19 21:58 UTC (permalink / raw)
  To: git

Petr Baudis wrote:
 
> We already have support for recording something similar, it's called a
> revlog. You would just need to modify it to aggregate all the branches
> in a single file.

_reflog_, not revlog.

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 21:42   ` Joel Dice
@ 2006-09-19 22:00     ` Petr Baudis
  2006-09-19 22:24       ` Joel Dice
  2006-09-19 22:39     ` Shawn Pearce
  1 sibling, 1 reply; 28+ messages in thread
From: Petr Baudis @ 2006-09-19 22:00 UTC (permalink / raw)
  To: Joel Dice; +Cc: git

Dear diary, on Tue, Sep 19, 2006 at 11:42:20PM CEST, I got a letter
where Joel Dice <dicej@mailsnare.net> said that...
> On Tue, 19 Sep 2006, Petr Baudis wrote:
> >Also, multiple IRNs could refer to a single real commit if you do e.g.
> >cg-admin-uncommit, since revlog logs revision updates, not new revisions
> >created. This may or may not be considered a good thing. If you rather
> >want to just create a new IRN at commit object creation time, also note
> >that some tools _might_ validly create commit objects and then throw
> >them away, which would generate non-sensical (and after prune, invalid)
> >IRNs.
> 
> I'm not too worried about cg-admin-uncommit or git-reset, since the IRN 
> feature is intended mainly for shared repositories.  I would suggest that 
> such commands simply be disallowed for such repositories.

  What kind of shared repositories? You yourself said that IRNs are
local to a repository, thus they are not preserved over cloning/fetching
from a repository, if you mean that.

> The problem of temporary commits certainly needs to be addressed.  In this 
> case, may I assume nothing under $GIT_DIR/refs is ever modified?  If so, 
> perhaps I could somehow hook into the git-update-ref step.  Is that what 
> the revlog code does?

  Yes. But not every commit is always recorded to something in refs/.
The simplest case is if you fetch from a remote repository (or push to
your repository), only the latest commit is recorded.

-- 
				Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
Snow falling on Perl. White noise covering line noise.
Hides all the bugs too. -- J. Putnam

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 21:51 ` Linus Torvalds
@ 2006-09-19 22:06   ` Petr Baudis
  2006-09-19 22:20     ` Linus Torvalds
                       ` (2 more replies)
  0 siblings, 3 replies; 28+ messages in thread
From: Petr Baudis @ 2006-09-19 22:06 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Joel Dice, git

Dear diary, on Tue, Sep 19, 2006 at 11:51:49PM CEST, I got a letter
where Linus Torvalds <torvalds@osdl.org> said that...
> Another thing you CAN do, is to just number them in time in a single repo. 
> Every time you do a commit, you can create a "r1.<n+1>" revision, and that 
> would work. It wouldn't look like the SVN numbers do, and it would only 
> work _within_ that repository, but it would work.
> 
> But it would mean that "r1.57" is _not_ necessarily the child of "r1.56". 
> It might be that "r1.56" was done on another branch, and is totally 
> unrelated to "r1.57" (other than they sharing some common ancestor far 
> back).

This is actually exactly how SVN revision numbering works. There's just
a single number (no '1.') and it indeed jumps randomly if you have
several concurrent branches in your (ok, Linus does not have any, just
someone's) repository.

> You're going to hit a few confusing issues if you really want to call 
> things "r1.x.y.z"

Noone does, that indeed would be horrible. But having the commits
numbered inside a repository would indeed make for simple usage if you
need to type in commit ids frequently, and could make Git a bit
friendlier to newcomers.

-- 
				Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
Snow falling on Perl. White noise covering line noise.
Hides all the bugs too. -- J. Putnam

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 21:07 Subversion-style incrementing revision numbers Joel Dice
  2006-09-19 21:18 ` Petr Baudis
  2006-09-19 21:51 ` Linus Torvalds
@ 2006-09-19 22:07 ` Jakub Narebski
  2006-09-19 22:11   ` Petr Baudis
                     ` (4 more replies)
  2006-09-19 22:09 ` Shawn Pearce
  3 siblings, 5 replies; 28+ messages in thread
From: Jakub Narebski @ 2006-09-19 22:07 UTC (permalink / raw)
  To: git

Joel Dice wrote:

> I'm considering adopting Git for a medium-sized project which is currently 
> managed using Subversion.  I've used Git for a few smaller projects 
> already, and the thing I've missed most from Subversion is the convenience 
> of incrementing revision numbers.  The following is a proposal to add this 
> feature to Git.
> 
> 
> Rationale:
> 
> Incrementing revision numbers (IRNs - an acronym I just made up) are 
> useful in that they can be treated as auto-generated tags which are easier 
> to remember and communicate than SHA hashes, yet do not require extra 
> effort to create like real tags.  Also, they have the advantage of being 
> chronologically ordered, so if I assert that a bug was fixed in revision 
> 42 of a shared repository, everyone may assume that revision 45 has that 
> fix as well.

That is true _only_ if you have linear history. If you have multiple
concurrent branches, revision 42 can be in branch 'next', revision '45' in
topic branch 'xx/topic' which forked before revision 42, and do not have
the fix.

Unfortunately, one cannot (as of now) use result of git-describe as
<commit-ish>. I'd rather have it fixed, than port idea from _centralized_
SCM do distributed SCM.

> Proposal:
> 
> As with Subversion, the IRN state in Git would be specific to a given 
> repository and have no significance beyond that repository.  Also like 
> Subversion, IRN state would be global across a repository, so that a 
> commit to any branch would increment the current IRN value.  Every Git 
> command taking a revision parameter would accept an IRN using a syntax 
> such as "r$IRN".  Every commit would report the IRN to the user as well as 
> the SHA ID.  The IRN feature could be enabled or disabled via a 
> configuration option.

This of course limits IRN much. Tags are valid across repositories.
I'm not sure if many repositories are managed using shared repositories
(centralized approach).

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 21:07 Subversion-style incrementing revision numbers Joel Dice
                   ` (2 preceding siblings ...)
  2006-09-19 22:07 ` Jakub Narebski
@ 2006-09-19 22:09 ` Shawn Pearce
  2006-09-19 22:40   ` Joel Dice
  3 siblings, 1 reply; 28+ messages in thread
From: Shawn Pearce @ 2006-09-19 22:09 UTC (permalink / raw)
  To: Joel Dice; +Cc: git

Joel Dice <dicej@mailsnare.net> wrote:
> I'm considering adopting Git for a medium-sized project which is currently 
> managed using Subversion.  I've used Git for a few smaller projects 
> already, and the thing I've missed most from Subversion is the convenience 
> of incrementing revision numbers.  The following is a proposal to add this 
> feature to Git.

I can't say I miss that particular feature.  Abbrevations of
SHA1 IDs tend to work very well for the projects I use Git on;
6-8 characters is easily more than enough to uniquely identify
a revision.  Heck half the time even 4 hex characters is enough.
 
> Rationale:
> 
> Incrementing revision numbers (IRNs - an acronym I just made up) are 
> useful in that they can be treated as auto-generated tags which are easier 
> to remember and communicate than SHA hashes, yet do not require extra 
> effort to create like real tags.  Also, they have the advantage of being 
> chronologically ordered, so if I assert that a bug was fixed in revision 
> 42 of a shared repository, everyone may assume that revision 45 has that 
> fix as well.

But with respect to what branch?

Branches in a Git repository are very common:

    o------o-o-o-o-o-o---  B1
   /
  -o--o--o-----o--------o  B2

Assuming the branch point on the left was r60, what is the latest
commit on B1?  On B2?  What about if I merge B1 and B2 together?

Or are you proposing that the commits are ordered by the time that
they arrive into the repository?

But even if that's the case lets say I fix the bug on B1 in r42
but a commit on B2 gets assigned r45.  The bug isn't fixed in r45;
not unless B1 was merged into B2 in r43, r44 or r45. But there's
no way to know that from just an IRN.

I fail to see how IRNs simplify commit naming or determining where
a feature or bug fix is within the branching structure.
 
> A simple, efficient implementation of this feature would be based on a 
> single file, $GIT_DIR/history, which would contain a newline-delimited 
> list of SHA commit IDs in chronological order, oldest first.  The current 
> repository IRN would be calculated as the size of that file divided by the 
> SHA+newline length, and the commit ID of any IRN could be determined by 
> seeking to the correct offset in that file.  Every commit would cause a 
> new line to be appended to the history file with that commit's ID. 
> Finally, a history file could be generated for an existing repository by 
> serializing the commit history based on chronological order.

How about just using bare tags under the namespace 'refs/tags/r/'?
With the new packed refs implemention these would cost you a tiny
amount of overhead over what you propose (due to the ref name also
being stored) but its already implemented and does the job just
as well.

-- 
Shawn.

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:07 ` Jakub Narebski
@ 2006-09-19 22:11   ` Petr Baudis
  2006-09-19 22:17   ` Jakub Narebski
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 28+ messages in thread
From: Petr Baudis @ 2006-09-19 22:11 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

Dear diary, on Wed, Sep 20, 2006 at 12:07:08AM CEST, I got a letter
where Jakub Narebski <jnareb@gmail.com> said that...
> Joel Dice wrote:
> > Rationale:
> > 
> > Incrementing revision numbers (IRNs - an acronym I just made up) are 
> > useful in that they can be treated as auto-generated tags which are easier 
> > to remember and communicate than SHA hashes, yet do not require extra 
> > effort to create like real tags.  Also, they have the advantage of being 
> > chronologically ordered, so if I assert that a bug was fixed in revision 
> > 42 of a shared repository, everyone may assume that revision 45 has that 
> > fix as well.
> 
> That is true _only_ if you have linear history. If you have multiple
> concurrent branches, revision 42 can be in branch 'next', revision '45' in
> topic branch 'xx/topic' which forked before revision 42, and do not have
> the fix.

Oops, I've completely overlooked that bit of the rationale. Of course
IRNs cannot assure this.

-- 
				Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
Snow falling on Perl. White noise covering line noise.
Hides all the bugs too. -- J. Putnam

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:07 ` Jakub Narebski
  2006-09-19 22:11   ` Petr Baudis
@ 2006-09-19 22:17   ` Jakub Narebski
  2006-09-19 23:07     ` Joel Dice
  2006-09-19 22:18   ` Shawn Pearce
                     ` (2 subsequent siblings)
  4 siblings, 1 reply; 28+ messages in thread
From: Jakub Narebski @ 2006-09-19 22:17 UTC (permalink / raw)
  To: git

Jakub Narebski wrote:

> Joel Dice wrote:
> 
>> I'm considering adopting Git for a medium-sized project which is currently 
>> managed using Subversion.  I've used Git for a few smaller projects 
>> already, and the thing I've missed most from Subversion is the convenience 
>> of incrementing revision numbers.  The following is a proposal to add this 
>> feature to Git.
>> 
>> 
>> Rationale:
>> 
>> Incrementing revision numbers (IRNs - an acronym I just made up) are 
>> useful in that they can be treated as auto-generated tags which are easier 
>> to remember and communicate than SHA hashes, yet do not require extra 
>> effort to create like real tags.  Also, they have the advantage of being 
>> chronologically ordered, so if I assert that a bug was fixed in revision 
>> 42 of a shared repository, everyone may assume that revision 45 has that 
>> fix as well.
> 
> That is true _only_ if you have linear history. If you have multiple
> concurrent branches, revision 42 can be in branch 'next', revision '45' in
> topic branch 'xx/topic' which forked before revision 42, and do not have
> the fix.

Additionally, what does _chronological_ mean? Time the commit is recorded?
Remember that in distributed development commits can be fetched from other
repository, or arrive via email and applied using git-am. In git you can
also rebase branch. Git records merges, and said merges are sometimes
just fast-forward. All those difficulties have to be solved for IRNs.

By the way, there was similar proposal to add either hidden field ('note'
like) to commit object denoting _generation_ of commit, or add cache of
commits' generation numbers. Generation number of root (parentless) commit
is 0, generation number of a commit is maximum of generation numbers of its
parents plus 1. But this proposal was for easier and faster generation of
topological order.

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:07 ` Jakub Narebski
  2006-09-19 22:11   ` Petr Baudis
  2006-09-19 22:17   ` Jakub Narebski
@ 2006-09-19 22:18   ` Shawn Pearce
  2006-09-19 22:23   ` Shawn Pearce
  2006-09-19 22:30   ` Joel Dice
  4 siblings, 0 replies; 28+ messages in thread
From: Shawn Pearce @ 2006-09-19 22:18 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

Jakub Narebski <jnareb@gmail.com> wrote:
> Unfortunately, one cannot (as of now) use result of git-describe as
> <commit-ish>. I'd rather have it fixed, than port idea from _centralized_
> SCM do distributed SCM.

This doesn't work?

	git log $(git describe | cut -d- -f2 | sed 's/^g//')

Its obviously so clear and easy to type!  :-)

That should be pretty easy to teach sha1_name.c:get_sha1_basic to
look for the pattern commonly used by git-describe, break on "-g",
verify the tag, then unabbreviate the ID.

-- 
Shawn.

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:06   ` Petr Baudis
@ 2006-09-19 22:20     ` Linus Torvalds
  2006-09-19 23:35       ` Joel Dice
  2006-09-20  7:46     ` Junio C Hamano
  2006-09-20 17:28     ` Robin Rosenberg
  2 siblings, 1 reply; 28+ messages in thread
From: Linus Torvalds @ 2006-09-19 22:20 UTC (permalink / raw)
  To: Petr Baudis; +Cc: Joel Dice, git



On Wed, 20 Sep 2006, Petr Baudis wrote:
>
> > It might be that "r1.56" was done on another branch, and is totally 
> > unrelated to "r1.57" (other than they sharing some common ancestor far 
> > back).
> 
> This is actually exactly how SVN revision numbering works. There's just
> a single number (no '1.') and it indeed jumps randomly if you have
> several concurrent branches in your (ok, Linus does not have any, just
> someone's) repository.

Oh, ok, if it's just a single numbering, then that's easy to do. It won't 
_mean_ anything, and you're seriously screwed if you ever merge anything 
else (or use a git that doesn't update the refcache or whatever), but it 
is simple and stable within a single repo.

		Linus

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:07 ` Jakub Narebski
                     ` (2 preceding siblings ...)
  2006-09-19 22:18   ` Shawn Pearce
@ 2006-09-19 22:23   ` Shawn Pearce
  2006-09-19 22:30   ` Joel Dice
  4 siblings, 0 replies; 28+ messages in thread
From: Shawn Pearce @ 2006-09-19 22:23 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

Jakub Narebski <jnareb@gmail.com> wrote:
> Joel Dice wrote:
> > Proposal:
> > 
> > As with Subversion, the IRN state in Git would be specific to a given 
> > repository and have no significance beyond that repository.  Also like 
> > Subversion, IRN state would be global across a repository, so that a 
> > commit to any branch would increment the current IRN value.  Every Git 
> > command taking a revision parameter would accept an IRN using a syntax 
> > such as "r$IRN".  Every commit would report the IRN to the user as well as 
> > the SHA ID.  The IRN feature could be enabled or disabled via a 
> > configuration option.
> 
> This of course limits IRN much. Tags are valid across repositories.
> I'm not sure if many repositories are managed using shared repositories
> (centralized approach).

Not only that but its somewhat difficult to execute
`git log v1.4.0..v1.4.1` on a central repository; if IRNs are only
valid within that repository then that's the only way they could
even be used.

Note that somewhat difficult here means you need to:

	- gain direct read-only access to the repository's files (not
	  all systems may be able to offer this to all users);

	- set GIT_DIR environment variable OR pass --git-dir before
	  the subcommand;

	- do all of that without doing something stupid in the
	  repository directory such as `rm *` without realizing
	  where you are;

	- but still maintain write access so you can push.

and that latter GIT_DIR/--git-dir part users are bound to forgot as
its not as natural as just assuming the repository is the directory
you are in.  Of course that could be probably fixed...

-- 
Shawn.

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:00     ` Petr Baudis
@ 2006-09-19 22:24       ` Joel Dice
  2006-09-19 22:33         ` Shawn Pearce
  2006-09-19 22:40         ` Johannes Schindelin
  0 siblings, 2 replies; 28+ messages in thread
From: Joel Dice @ 2006-09-19 22:24 UTC (permalink / raw)
  To: Petr Baudis; +Cc: git

On Wed, 20 Sep 2006, Petr Baudis wrote:

> Dear diary, on Tue, Sep 19, 2006 at 11:42:20PM CEST, I got a letter
> where Joel Dice <dicej@mailsnare.net> said that...
>> On Tue, 19 Sep 2006, Petr Baudis wrote:
>>> Also, multiple IRNs could refer to a single real commit if you do e.g.
>>> cg-admin-uncommit, since revlog logs revision updates, not new revisions
>>> created. This may or may not be considered a good thing. If you rather
>>> want to just create a new IRN at commit object creation time, also note
>>> that some tools _might_ validly create commit objects and then throw
>>> them away, which would generate non-sensical (and after prune, invalid)
>>> IRNs.
>>
>> I'm not too worried about cg-admin-uncommit or git-reset, since the IRN
>> feature is intended mainly for shared repositories.  I would suggest that
>> such commands simply be disallowed for such repositories.
>
>  What kind of shared repositories? You yourself said that IRNs are
> local to a repository, thus they are not preserved over cloning/fetching
> from a repository, if you mean that.

The scenario I envision is several developers, each with a clone of a 
shared repository.  The clones would not have IRNs turned on, only the 
shared repository.  So, when I do a "git push", I get an IRN back, and I 
am not confused, because I know that IRN only applies to the shared 
repository.  Then, when I mark a Bugzilla bug as fixed and attach the IRN 
to it, everybody knows that IRN refers to the shared repository.  After 
all, I wouldn't mark the bug fixed if I had only committed it to my own 
private repository.

I could also turn on IRNs on my clone if I really wanted, but not if I 
thought it would confuse myself or others.

>> The problem of temporary commits certainly needs to be addressed.  In this
>> case, may I assume nothing under $GIT_DIR/refs is ever modified?  If so,
>> perhaps I could somehow hook into the git-update-ref step.  Is that what
>> the revlog code does?
>
>  Yes. But not every commit is always recorded to something in refs/.
> The simplest case is if you fetch from a remote repository (or push to
> your repository), only the latest commit is recorded.

That's what I figured.  I should be able to walk the commit chain to get 
at all the commits in a push or fetch, right?

  - Joel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:07 ` Jakub Narebski
                     ` (3 preceding siblings ...)
  2006-09-19 22:23   ` Shawn Pearce
@ 2006-09-19 22:30   ` Joel Dice
  4 siblings, 0 replies; 28+ messages in thread
From: Joel Dice @ 2006-09-19 22:30 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

On Wed, 20 Sep 2006, Jakub Narebski wrote:

> Joel Dice wrote:
>
>> I'm considering adopting Git for a medium-sized project which is currently
>> managed using Subversion.  I've used Git for a few smaller projects
>> already, and the thing I've missed most from Subversion is the convenience
>> of incrementing revision numbers.  The following is a proposal to add this
>> feature to Git.
>>
>>
>> Rationale:
>>
>> Incrementing revision numbers (IRNs - an acronym I just made up) are
>> useful in that they can be treated as auto-generated tags which are easier
>> to remember and communicate than SHA hashes, yet do not require extra
>> effort to create like real tags.  Also, they have the advantage of being
>> chronologically ordered, so if I assert that a bug was fixed in revision
>> 42 of a shared repository, everyone may assume that revision 45 has that
>> fix as well.
>
> That is true _only_ if you have linear history. If you have multiple
> concurrent branches, revision 42 can be in branch 'next', revision '45' in
> topic branch 'xx/topic' which forked before revision 42, and do not have
> the fix.

In practice, this is not a problem.  The branch referred to is usually 
understood from the context (ex. a Bugzilla bug for a particular version 
of a product implies a particular branch).  Otherwise, yes, you must also 
explictly state which branch the fix was applied to.

> Unfortunately, one cannot (as of now) use result of git-describe as
> <commit-ish>. I'd rather have it fixed, than port idea from _centralized_
> SCM do distributed SCM.
>
>> Proposal:
>>
>> As with Subversion, the IRN state in Git would be specific to a given
>> repository and have no significance beyond that repository.  Also like
>> Subversion, IRN state would be global across a repository, so that a
>> commit to any branch would increment the current IRN value.  Every Git
>> command taking a revision parameter would accept an IRN using a syntax
>> such as "r$IRN".  Every commit would report the IRN to the user as well as
>> the SHA ID.  The IRN feature could be enabled or disabled via a
>> configuration option.
>
> This of course limits IRN much. Tags are valid across repositories.
> I'm not sure if many repositories are managed using shared repositories
> (centralized approach).

I would suggest that most repositories are centralized.  They're just not 
using Git yet :)

  - Joel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:24       ` Joel Dice
@ 2006-09-19 22:33         ` Shawn Pearce
  2006-09-19 22:40         ` Johannes Schindelin
  1 sibling, 0 replies; 28+ messages in thread
From: Shawn Pearce @ 2006-09-19 22:33 UTC (permalink / raw)
  To: Joel Dice; +Cc: Petr Baudis, git

Joel Dice <dicej@mailsnare.net> wrote:
> The scenario I envision is several developers, each with a clone of a 
> shared repository.  The clones would not have IRNs turned on, only the 
> shared repository.  So, when I do a "git push", I get an IRN back, and I 
> am not confused, because I know that IRN only applies to the shared 
> repository.  Then, when I mark a Bugzilla bug as fixed and attach the IRN 
> to it, everybody knows that IRN refers to the shared repository.  After 
> all, I wouldn't mark the bug fixed if I had only committed it to my own 
> private repository.

How about recording the Bugzilla bug id in the commit message (such
as by simply mentioning "bug 123") and having an update hook on the
central repository extract that from the commits being pushed and
posting an update to the Bugzilla database?  The update can include
the branch name the commit(s) were pushed into and the final commit
SHA1 (or say 8 character abbreviation).

Its automatic and its easy for the developers.  I'm (sort of) doing
this for a system that's a lot more difficult to use than Bugzilla.
My fellow developers are very happy.
 
> That's what I figured.  I should be able to walk the commit chain to get 
> at all the commits in a push or fetch, right?

In the update hook you get 3 args:  refname oldsha1 newsha1

You can get the list of commits you are "receiving" during the single
push operation from:

	git log --pretty=raw $2..$3 

a quick parse for "bug (\d)+" on that text, make a set of of IDs
to update, then go update then storing the first 8 characters of
$3 and $1 (the branch name) into your bug tracker.

I said "receiving" in air quotes as you may already have some or
all of those commits in the current repository; they just are part
of other branches other than the one being pushed into.


Later another developer can ask if the fix for bug 123 is in any
given branch by looking at

	git log master..$idfrombug

where 'master' is any branch and $idfrombug is the 8 character
abbreviation you stored into the bug record in the update hook.

If this returns no output then the bug fix is contained in the
branch master; if it returns output then those are the commits
which were considered to be part of the bug fix that aren't in the
branch master.

-- 
Shawn.

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 21:42   ` Joel Dice
  2006-09-19 22:00     ` Petr Baudis
@ 2006-09-19 22:39     ` Shawn Pearce
  1 sibling, 0 replies; 28+ messages in thread
From: Shawn Pearce @ 2006-09-19 22:39 UTC (permalink / raw)
  To: Joel Dice; +Cc: Petr Baudis, git

Joel Dice <dicej@mailsnare.net> wrote:
> I'm not too worried about cg-admin-uncommit or git-reset, since the IRN 
> feature is intended mainly for shared repositories.  I would suggest that 
> such commands simply be disallowed for such repositories.
> 
> The problem of temporary commits certainly needs to be addressed.  In this 
> case, may I assume nothing under $GIT_DIR/refs is ever modified?  If so, 
> perhaps I could somehow hook into the git-update-ref step.  Is that what 
> the revlog code does?

$GIT_DIR/refs is always modified.  Its probably the most heavily
modified part of a GIT_DIR, aside from the index.  Simply because
the ref files must be modified every time a commit, fetch or merge
completes.  Its also a directory you don't want to delete; I once
did an `rm -rf .git/refs` in a repository with a many branches.
That was no fun to recover.

git-update-ref is used by pretty much all non-C code to update a
ref file.  The APIs it calls invoke the reflog code to record the
update being made to the ref if the user has enabled logging on
that ref (not all users want all refs logged apparently).  I don't
think its a great idea to plug more complex logic into that part
of the system.  The reflog code already made it more complex then
it needed to be; Linus apparently just found out how heavily we
use static buffers down there...

-- 
Shawn.

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:09 ` Shawn Pearce
@ 2006-09-19 22:40   ` Joel Dice
  0 siblings, 0 replies; 28+ messages in thread
From: Joel Dice @ 2006-09-19 22:40 UTC (permalink / raw)
  To: Shawn Pearce; +Cc: git

On Tue, 19 Sep 2006, Shawn Pearce wrote:

> Joel Dice <dicej@mailsnare.net> wrote:
>> I'm considering adopting Git for a medium-sized project which is currently
>> managed using Subversion.  I've used Git for a few smaller projects
>> already, and the thing I've missed most from Subversion is the convenience
>> of incrementing revision numbers.  The following is a proposal to add this
>> feature to Git.
>
> I can't say I miss that particular feature.  Abbrevations of
> SHA1 IDs tend to work very well for the projects I use Git on;
> 6-8 characters is easily more than enough to uniquely identify
> a revision.  Heck half the time even 4 hex characters is enough.
>
>> Rationale:
>>
>> Incrementing revision numbers (IRNs - an acronym I just made up) are
>> useful in that they can be treated as auto-generated tags which are easier
>> to remember and communicate than SHA hashes, yet do not require extra
>> effort to create like real tags.  Also, they have the advantage of being
>> chronologically ordered, so if I assert that a bug was fixed in revision
>> 42 of a shared repository, everyone may assume that revision 45 has that
>> fix as well.
>
> But with respect to what branch?
>
> Branches in a Git repository are very common:
>
>    o------o-o-o-o-o-o---  B1
>   /
>  -o--o--o-----o--------o  B2
>
> Assuming the branch point on the left was r60, what is the latest
> commit on B1?  On B2?  What about if I merge B1 and B2 together?

Branches in Subversion are also very common.  The "last changed" IRN for a 
branch is the index of the head of the branch in the history.

> Or are you proposing that the commits are ordered by the time that
> they arrive into the repository?

Yes.

> But even if that's the case lets say I fix the bug on B1 in r42
> but a commit on B2 gets assigned r45.  The bug isn't fixed in r45;
> not unless B1 was merged into B2 in r43, r44 or r45. But there's
> no way to know that from just an IRN.
>
> I fail to see how IRNs simplify commit naming or determining where
> a feature or bug fix is within the branching structure.

I'm not suggesting that an IRN stand on it's own in this way.  Additional 
context may be necessary depending on the situation.  It's intended as a 
convenience, not a replacement for the SHA IDs.

>> A simple, efficient implementation of this feature would be based on a
>> single file, $GIT_DIR/history, which would contain a newline-delimited
>> list of SHA commit IDs in chronological order, oldest first.  The current
>> repository IRN would be calculated as the size of that file divided by the
>> SHA+newline length, and the commit ID of any IRN could be determined by
>> seeking to the correct offset in that file.  Every commit would cause a
>> new line to be appended to the history file with that commit's ID.
>> Finally, a history file could be generated for an existing repository by
>> serializing the commit history based on chronological order.
>
> How about just using bare tags under the namespace 'refs/tags/r/'?
> With the new packed refs implemention these would cost you a tiny
> amount of overhead over what you propose (due to the ref name also
> being stored) but its already implemented and does the job just
> as well.

Good idea.  I'll try that.

  - Joel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:24       ` Joel Dice
  2006-09-19 22:33         ` Shawn Pearce
@ 2006-09-19 22:40         ` Johannes Schindelin
  1 sibling, 0 replies; 28+ messages in thread
From: Johannes Schindelin @ 2006-09-19 22:40 UTC (permalink / raw)
  To: Joel Dice; +Cc: Petr Baudis, git

Hi,

On Tue, 19 Sep 2006, Joel Dice wrote:

> The scenario I envision is several developers, each with a clone of a 
> shared repository.  The clones would not have IRNs turned on, only the 
> shared repository.  So, when I do a "git push", I get an IRN back, and I 
> am not confused, because I know that IRN only applies to the shared 
> repository. Then, when I mark a Bugzilla bug as fixed and attach the IRN 
> to it, everybody knows that IRN refers to the shared repository.  After 
> all, I wouldn't mark the bug fixed if I had only committed it to my own 
> private repository.

Why not just tag the commit with something like "bugzilla/#bugid"? 
Granted, it makes for lots of tags. But we actually handle lots of tags.

BTW if your IRN just wants to serve to be less cryptic than SHA1s, you can 
try git-name-rev (of course, it is only immutable if you have a recent 
tag and use the --tags option).

Ciao,
Dscho

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:17   ` Jakub Narebski
@ 2006-09-19 23:07     ` Joel Dice
  0 siblings, 0 replies; 28+ messages in thread
From: Joel Dice @ 2006-09-19 23:07 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git

On Wed, 20 Sep 2006, Jakub Narebski wrote:

> Jakub Narebski wrote:
>
>> Joel Dice wrote:
>>
>>> I'm considering adopting Git for a medium-sized project which is currently
>>> managed using Subversion.  I've used Git for a few smaller projects
>>> already, and the thing I've missed most from Subversion is the convenience
>>> of incrementing revision numbers.  The following is a proposal to add this
>>> feature to Git.
>>>
>>>
>>> Rationale:
>>>
>>> Incrementing revision numbers (IRNs - an acronym I just made up) are
>>> useful in that they can be treated as auto-generated tags which are easier
>>> to remember and communicate than SHA hashes, yet do not require extra
>>> effort to create like real tags.  Also, they have the advantage of being
>>> chronologically ordered, so if I assert that a bug was fixed in revision
>>> 42 of a shared repository, everyone may assume that revision 45 has that
>>> fix as well.
>>
>> That is true _only_ if you have linear history. If you have multiple
>> concurrent branches, revision 42 can be in branch 'next', revision '45' in
>> topic branch 'xx/topic' which forked before revision 42, and do not have
>> the fix.
>
> Additionally, what does _chronological_ mean? Time the commit is recorded?

Yes.

> Remember that in distributed development commits can be fetched from other
> repository, or arrive via email and applied using git-am. In git you can
> also rebase branch. Git records merges, and said merges are sometimes
> just fast-forward. All those difficulties have to be solved for IRNs.

All of these boil down to pointing the head of a branch to a new commit 
object, right?  I'm simply proposing that every time this happens, that 
new commit object (which may not really be *new*), should be appended to 
the IRN history file, along with any commits attached to it (as in the 
cases of fetch, etc.).

  - Joel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:20     ` Linus Torvalds
@ 2006-09-19 23:35       ` Joel Dice
  2006-09-20  0:15         ` Jakub Narebski
  0 siblings, 1 reply; 28+ messages in thread
From: Joel Dice @ 2006-09-19 23:35 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Petr Baudis, git

On Tue, 19 Sep 2006, Linus Torvalds wrote:
> On Wed, 20 Sep 2006, Petr Baudis wrote:
>> This is actually exactly how SVN revision numbering works. There's just
>> a single number (no '1.') and it indeed jumps randomly if you have
>> several concurrent branches in your (ok, Linus does not have any, just
>> someone's) repository.
>
> Oh, ok, if it's just a single numbering, then that's easy to do. It won't
> _mean_ anything, and you're seriously screwed if you ever merge anything
> else (or use a git that doesn't update the refcache or whatever), but it
> is simple and stable within a single repo.

Well, what it means is "this is the order in which commits were applied to 
this repository".  I suggest that this information is useful for the most 
common development style - the kind which relies on a central repository 
as the canonical source for a project's code.  "gcc-trunk-r117064" means a 
lot more to me than "39282037d7cc39829f1d56bf8307b8e5430d585f", and is no 
less precise.

I do believe that distributed VCSs such as Git can improve the 
productivity of these kinds of projects without forcing the developers to 
suddenly and dramatically alter their workflow.  I think ICNs would help 
make this possible.

  - Joel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 23:35       ` Joel Dice
@ 2006-09-20  0:15         ` Jakub Narebski
  2006-09-20 16:13           ` Joel Dice
  0 siblings, 1 reply; 28+ messages in thread
From: Jakub Narebski @ 2006-09-20  0:15 UTC (permalink / raw)
  To: git

Joel Dice wrote:

> On Tue, 19 Sep 2006, Linus Torvalds wrote:
>> On Wed, 20 Sep 2006, Petr Baudis wrote:
>>> This is actually exactly how SVN revision numbering works. There's just
>>> a single number (no '1.') and it indeed jumps randomly if you have
>>> several concurrent branches in your (ok, Linus does not have any, just
>>> someone's) repository.
>>
>> Oh, ok, if it's just a single numbering, then that's easy to do. It won't
>> _mean_ anything, and you're seriously screwed if you ever merge anything
>> else (or use a git that doesn't update the refcache or whatever), but it
>> is simple and stable within a single repo.
> 
> Well, what it means is "this is the order in which commits were applied to 
> this repository".  I suggest that this information is useful for the most 
> common development style - the kind which relies on a central repository 
> as the canonical source for a project's code.  "gcc-trunk-r117064" means a 
> lot more to me than "39282037d7cc39829f1d56bf8307b8e5430d585f", and is no 
> less precise.

What about "v1.4.2.1-gf7f93e7", or "tags/v1.4.2-rc4^0~19", or just
"39282037"? Or "next@{2006-09-19 22:44:33 +0000}"?

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:06   ` Petr Baudis
  2006-09-19 22:20     ` Linus Torvalds
@ 2006-09-20  7:46     ` Junio C Hamano
  2006-09-20 17:28     ` Robin Rosenberg
  2 siblings, 0 replies; 28+ messages in thread
From: Junio C Hamano @ 2006-09-20  7:46 UTC (permalink / raw)
  To: Petr Baudis; +Cc: Joel Dice, git, Linus Torvalds

Petr Baudis <pasky@suse.cz> writes, responding to Linus:

>> You're going to hit a few confusing issues if you really want to call 
>> things "r1.x.y.z"
>
> Noone does, that indeed would be horrible. But having the commits
> numbered inside a repository would indeed make for simple usage if you
> need to type in commit ids frequently, and could make Git a bit
> friendlier to newcomers.

SVN increments the number every time anything changes in the
whole-tree.  Typically (1) when you make a commit, anywhere, in
the tree or (2) when you tag or branch.  An interesting property
of SVN version number is that you can say "at revision 1423,
frotz and nitfol branches existed (filfre branch did not exist
back then) and their states were such and such".

So if Pasky wants to help Joel to emulate it in git, it is not
sufficient to number commits because there are fast-forwards and
it happens rather often in reality.  A closer emulation at the
conceptual level is to run pack-refs every time you change any
ref in your repository and version control the resulting
packed-ref file with serial number.

Then when people talk about git.git repository at kernel.org
people can say "the repository at revision 144 had master at
019ba86 and next at 832e76a; tag v1.4.3 did not exist back
then."

Is it useful?  In general I think it is useful only as a local
matter, just like ref-log is useful locally.  In fact, I think
it is a natural extension of the ref-log (and it can even
capture where the tags were, which I sometimes find sorely
lacking in the current ref-log scheme -- anybody want to update
git-tag.sh to have it use ref-log?  hint hint...).

But I am not sure how you would propagate it sanely in the
distributed environment.

I do not often pull from others, but I occasionally pull from
Paul's gitk tree.  When I see gitk's tip advance and I pull from
him, I may end up getting a string of two commits.  In other
words, in Joel's serial numbered revision scheme (emulated by
packed-ref snapshots versioned serially), there are two gitk
commits between my rN and r(N+1).

Somebody who hasn't thought about merges might be tempted to say
that we should use 2 revision numbers when a pull ends up
integrating 2 commits from outside, but that is not really
feasible.  When you make a merge, it is not like you are
cherry-picking individual commits from somebody else one by one.
In state rN, I did not have either of these two commits, and in
state r(N+1) I now have both, and that is the only definition of
rN that makes any sense.

    Side note: SVN does not have this "one state change but with
    multiple revisions" uneasiness problem, because it does not
    have a merge in distributed SCM's sense.  What it has is a
    convenient way to side-port changes that happened elsewhere
    to your state and create a new commit (so it is not that
    different from "cvs update -j").  After a "merge" happens
    you are just one commit ahead from previous state, just like
    a normal commit.

    The difference from that and us is that "log ORIG_HEAD.."
    will say we got new two commits integrated with the merge
    which makes us wonder why there are multiple events between
    two states, while SVN does not record what got cherry-picked
    from the side so you cannot even worry about it if you
    wanted to ;-).

But that definition stops making sense immediately when you look
at things from Paul's point of view.  He had these two commits
done separately, and in his repository they are recorded as two
separate events, even under Joel's serial numbered revision
scheme.  So for this serially numbered revisioning scheme to
make any sense to you, you have to refuse the everybody-is-equal
distributed model of git, and instead treat one repository
(mine) as more important than all others.  If that central
repository says these two commits did not exist in rN and they
appeared in r(N+1), that's the reality as far as you are
concerned, and what Paul says does not count to you at all.
That makes Paul unhappy.

In the same sense, you have to realize that the number "144"
above that came from kernel.org would mean absolutely nothing to
me.  I work on one commit at a time unless applying sequence of
patches, and typically ref-log knows that the last time _my_ tip
of "master" and "next" advanced were more than 30 minutes apart.
But I push four branches (maint/master/next/pu) out at the same
time to kernel.org, so between revision 143 and revision 144
four refs would have changed at kernel.org.  But in the
repository I do the real work with ref-log knows that that is
not the way how these branches advanced at all.  So it is not a
convenient number to work with from my point of view either.

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-20  0:15         ` Jakub Narebski
@ 2006-09-20 16:13           ` Joel Dice
  0 siblings, 0 replies; 28+ messages in thread
From: Joel Dice @ 2006-09-20 16:13 UTC (permalink / raw)
  To: git

On Wed, 20 Sep 2006, Jakub Narebski wrote:
> Joel Dice wrote:
>> Well, what it means is "this is the order in which commits were applied to
>> this repository".  I suggest that this information is useful for the most
>> common development style - the kind which relies on a central repository
>> as the canonical source for a project's code.  "gcc-trunk-r117064" means a
>> lot more to me than "39282037d7cc39829f1d56bf8307b8e5430d585f", and is no
>> less precise.
>
> What about "v1.4.2.1-gf7f93e7", or "tags/v1.4.2-rc4^0~19", or just
> "39282037"? Or "next@{2006-09-19 22:44:33 +0000}"?

The last one is closest to what I want in that it gives me some sense of 
the order in which commits appeared in the repository.

Anyway, after some reflection, I've come to the following conclusions:

  1. Although the IRN feature would be useful to people like me, it doesn't 
fit _naturally_ into Git in particular or DVCSs in general due to the 
fact that IRNs are tied to repositories.

  2. There are easier, more elegant ways to solve the problem of tying 
commits to bug numbers, as Shawn and Johannes pointed out.

So, I'm shelving the IRN idea until and unless I can reconcile it with the 
spirit of distributed version control.  In the meantime, I plan to pursue 
a solution along the lines of Shawn's update hook strategy for bug 
tracking, perhaps with the additional step of automatically tagging each 
such update.

Thanks for everyone's comments.

  - Joel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-19 22:06   ` Petr Baudis
  2006-09-19 22:20     ` Linus Torvalds
  2006-09-20  7:46     ` Junio C Hamano
@ 2006-09-20 17:28     ` Robin Rosenberg
  2006-09-20 18:22       ` Petr Baudis
  2 siblings, 1 reply; 28+ messages in thread
From: Robin Rosenberg @ 2006-09-20 17:28 UTC (permalink / raw)
  To: Petr Baudis; +Cc: Linus Torvalds, Joel Dice, git

onsdag 20 september 2006 00:06 skrev Petr Baudis:
[...]
> But having the commits
> numbered inside a repository would indeed make for simple usage if you
> need to type in commit ids frequently, and could make Git a bit
> friendlier to newcomers.

Typing those numbers is really insane, so the idea never occurred to me. Most 
environments have simple methods to copy and paste strings using a clipboard,
even in a console. So typically you can left-doubleclick on a string and paste 
with the middle button in *nix like systems (right button in cygwin/windows 
command line).

-- robin

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-20 17:28     ` Robin Rosenberg
@ 2006-09-20 18:22       ` Petr Baudis
  2006-09-20 19:07         ` Junio C Hamano
  0 siblings, 1 reply; 28+ messages in thread
From: Petr Baudis @ 2006-09-20 18:22 UTC (permalink / raw)
  To: Robin Rosenberg; +Cc: Linus Torvalds, Joel Dice, git

Dear diary, on Wed, Sep 20, 2006 at 07:28:45PM CEST, I got a letter
where Robin Rosenberg <robin.rosenberg.lists@dewire.com> said that...
> Typing those numbers is really insane, so the idea never occurred to me. Most 
> environments have simple methods to copy and paste strings using a clipboard,
> even in a console. So typically you can left-doubleclick on a string and paste 
> with the middle button in *nix like systems (right button in cygwin/windows 
> command line).

  ...which is certainly appealing for the Plan9 fans, but I'm not so
excited from having to grab my mouse all the time. :-) That said, typing
just the few leading digits is not really that painful.

-- 
				Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
#!/bin/perl -sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj
$/=unpack('H*',$_);$_=`echo 16dio\U$k"SK$/SM$n\EsN0p[lN*1
lK[d2%Sa2/d0$^Ixp"|dc`;s/\W//g;$_=pack('H*',/((..)*)$/)

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: Subversion-style incrementing revision numbers
  2006-09-20 18:22       ` Petr Baudis
@ 2006-09-20 19:07         ` Junio C Hamano
  0 siblings, 0 replies; 28+ messages in thread
From: Junio C Hamano @ 2006-09-20 19:07 UTC (permalink / raw)
  To: Petr Baudis; +Cc: git

Petr Baudis <pasky@suse.cz> writes:

> Dear diary, on Wed, Sep 20, 2006 at 07:28:45PM CEST, I got a letter
> where Robin Rosenberg <robin.rosenberg.lists@dewire.com> said that...
>> Typing those numbers is really insane, so the idea never occurred to me. Most 
>> environments have simple methods to copy and paste strings using a clipboard,
>> even in a console. So typically you can left-doubleclick on a string and paste 
>> with the middle button in *nix like systems (right button in cygwin/windows 
>> command line).
>
>   ...which is certainly appealing for the Plan9 fans, but I'm not so
> excited from having to grab my mouse all the time. :-)

I am so used to live always in "screen" so that is not much of a
problem for me.

Sorry for the noise ;-).

^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2006-09-20 19:07 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-09-19 21:07 Subversion-style incrementing revision numbers Joel Dice
2006-09-19 21:18 ` Petr Baudis
2006-09-19 21:42   ` Joel Dice
2006-09-19 22:00     ` Petr Baudis
2006-09-19 22:24       ` Joel Dice
2006-09-19 22:33         ` Shawn Pearce
2006-09-19 22:40         ` Johannes Schindelin
2006-09-19 22:39     ` Shawn Pearce
2006-09-19 21:58   ` Jakub Narebski
2006-09-19 21:51 ` Linus Torvalds
2006-09-19 22:06   ` Petr Baudis
2006-09-19 22:20     ` Linus Torvalds
2006-09-19 23:35       ` Joel Dice
2006-09-20  0:15         ` Jakub Narebski
2006-09-20 16:13           ` Joel Dice
2006-09-20  7:46     ` Junio C Hamano
2006-09-20 17:28     ` Robin Rosenberg
2006-09-20 18:22       ` Petr Baudis
2006-09-20 19:07         ` Junio C Hamano
2006-09-19 22:07 ` Jakub Narebski
2006-09-19 22:11   ` Petr Baudis
2006-09-19 22:17   ` Jakub Narebski
2006-09-19 23:07     ` Joel Dice
2006-09-19 22:18   ` Shawn Pearce
2006-09-19 22:23   ` Shawn Pearce
2006-09-19 22:30   ` Joel Dice
2006-09-19 22:09 ` Shawn Pearce
2006-09-19 22:40   ` Joel Dice

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).