Re: How do get a specific version of a particular file?
- From
Linus Torvalds <torvalds@linux-foundation.org>
- Date
- Feb 28, 2007, 00:22 UTC
- Message-ID
- <Pine.LNX.4.64.0702271605290.12485@woody.linux-foundation.org>
- In-Reply-To
- <7vfy8rb2do.fsf@assigned-by-dhcp.cox.net>
On Tue, 27 Feb 2007, Junio C Hamano wrote:
Show 19 quoted lines
> merlyn@stonehenge.com (Randal L. Schwartz) writes: > > >>>>>> "Theodore" == Theodore Tso <tytso@mit.edu> writes: > > > > Theodore> And I'm still not sure why > > > > Theodore> git show v1.5.0..v1.5.0.1 > > > > Theodore> doesn't throw an error, and why it prints what it does... > > > > Wait, that doesn't throw an error? > > > > (tries it) > > > > OK, how is that different from git-diff ? > > I do not think there is any difference. "show" is about > multiple points, not ranges. "diff" is about multiple > (typically two) points, and not ranges.
Well, I do think Ted has a good point. Having negative refs makes no sense for the "no-walk" case (aka "git show").
So when we do
git show v1.4.4..v1.5.0
that's an illogical thing to do, since "git show" is defined to be a non-revision-walking action, which means the range operator be pointless and wrong. The fact that we happily accept it (and then _only_ show v1.5.0, which is the positive end of the range) is quite arguably not very logical.
We should complain, and say that you can only do "no_walk" with positive refs. Negative object refs really don't make any sense unless you walk the obejct list (or you're "git diff" and know about ranges explicitly).
Something like this (although I don't know if my message is necessarily the best possible one).
Linus
---
diff --git a/revision.c b/revision.c index 4cf697e..b84c066 100644 --- a/revision.c +++ b/revision.c @@ -116,6 +116,8 @@ void mark_parents_uninteresting(struct commit *commit) void add_pending_object(struct rev_info *revs, struct object *obj, const char *name) { + if (revs->no_walk && (obj->flags & UNINTERESTING)) + die("object ranges do not make sense when not walking revisions"); add_object_array(obj, name, &revs->pending); if (revs->reflog_info && obj->type == OBJ_COMMIT) add_reflog_for_walk(revs->reflog_info,