git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* Question regarding git fetch
@ 2009-08-27 15:30 Tom Lambda
  2009-08-27 15:36 ` Avery Pennarun
  2009-08-28 13:24 ` Tom Lambda
  0 siblings, 2 replies; 17+ messages in thread
From: Tom Lambda @ 2009-08-27 15:30 UTC (permalink / raw
  To: git


I noticed that git-fetch seems smarter when it is run without a <refspec>
argument than when one specifies a branch name. I use a simple setup where a
remote central repository is defined when it is cloned the first time (clone
-o central ...). This leads to these default parameters:

remote.central.fetch=+refs/heads/*:refs/remotes/central/*
branch.master.remote=central
branch.master.merge=refs/heads/master

When I use "git fetch central" each branch in central's refs/heads/ is
automatically fetched to my refs/remotes/central/ as expected.

What was a little bit surprising to me is that running "git fetch central
master" does not update refs/remotes/central/master but simply updates
FETCH_HEAD.

I read the manual and I know that updating FETCH_HEAD is the expected
default behavior for git-fetch. However, I really like the fact that git
fetch (without <refspec>) knows that ANY branch in refs/heads/ corresponds
to refs/remotes/central/. Is there a way to change the configuration to have
"git fetch central branch" always updating refs/remotes/central/branch
whatever the specified branch.

I would prefer not to have to specify the <dst> each time:
git fetch central branch:remotes/central/branch

Thank you,
Tom

-- 
View this message in context: http://n2.nabble.com/Question-regarding-git-fetch-tp3527289p3527289.html
Sent from the git mailing list archive at Nabble.com.

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

* Re: Question regarding git fetch
  2009-08-27 15:30 Question regarding git fetch Tom Lambda
@ 2009-08-27 15:36 ` Avery Pennarun
  2009-08-27 16:21   ` Eric Raible
                     ` (2 more replies)
  2009-08-28 13:24 ` Tom Lambda
  1 sibling, 3 replies; 17+ messages in thread
From: Avery Pennarun @ 2009-08-27 15:36 UTC (permalink / raw
  To: Tom Lambda; +Cc: git

On Thu, Aug 27, 2009 at 3:30 PM, Tom Lambda<tom.lambda@gmail.com> wrote:
> What was a little bit surprising to me is that running "git fetch central
> master" does not update refs/remotes/central/master but simply updates
> FETCH_HEAD.

I've often wanted this myself, especially when doing things like "git
pull origin master".  However, I know the current behaviour is also
useful sometimes, and changing it would introduce an unexpected side
effect.  Git currently promises that your refs/remotes/* branches will
never be updated unless you explicitly request it, even if you're
fetching, merging, and pulling other stuff.  This means you can write
scripts to do complicated things without triggering unexpected
user-visible side effects.

So basically, I agree that it would often be much more user-friendly
to do what you're asking.  But it would be less scripting-friendly.  I
don't think anyone has thought of an answer that better balances the
two.

Have fun,

Avery

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

* Re: Question regarding git fetch
  2009-08-27 15:36 ` Avery Pennarun
@ 2009-08-27 16:21   ` Eric Raible
  2009-08-27 16:28     ` Avery Pennarun
  2009-08-27 16:46   ` Björn Steinbrink
  2009-08-27 21:20   ` Junio C Hamano
  2 siblings, 1 reply; 17+ messages in thread
From: Eric Raible @ 2009-08-27 16:21 UTC (permalink / raw
  To: git

Avery Pennarun <apenwarr <at> gmail.com> writes:

> Git currently promises that your refs/remotes/* branches will
> never be updated unless you explicitly request it, even if you're
> fetching, merging, and pulling other stuff.

So your claim is that "git fetch central" is somehow more
explicit than "git fetch central master"?

I understand that "git fetch central" will use
remote.central.fetch (which _is_ explicit), but
the command itself is certainly _less_ explicit about
specifying the remote branch.

Either way, AFAICT it seems purely historical that
"git fetch central master" doesn't update remotes/central.

- Eric

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

* Re: Question regarding git fetch
  2009-08-27 16:21   ` Eric Raible
@ 2009-08-27 16:28     ` Avery Pennarun
  0 siblings, 0 replies; 17+ messages in thread
From: Avery Pennarun @ 2009-08-27 16:28 UTC (permalink / raw
  To: Eric Raible; +Cc: git

On Thu, Aug 27, 2009 at 4:21 PM, Eric Raible<raible@gmail.com> wrote:
> Avery Pennarun <apenwarr <at> gmail.com> writes:
>
>> Git currently promises that your refs/remotes/* branches will
>> never be updated unless you explicitly request it, even if you're
>> fetching, merging, and pulling other stuff.
>
> So your claim is that "git fetch central" is somehow more
> explicit than "git fetch central master"?

It is, because there's nothing else you could possibly do with it.  It
fetches too many things, so you don't know their names (other than the
ones it puts into refs/remotes/*).

So it's not exactly that it's more explicit - in fact it's rather
confusing and non-explicit that the three-parameter version does
something almost entirely different from the four-parameter one - but
the three-parameter version is at least completely unambiguous.

> Either way, AFAICT it seems purely historical that
> "git fetch central master" doesn't update remotes/central.

This seems true to me.

Have fun,

Avery

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

* Re: Question regarding git fetch
  2009-08-27 15:36 ` Avery Pennarun
  2009-08-27 16:21   ` Eric Raible
@ 2009-08-27 16:46   ` Björn Steinbrink
  2009-08-27 17:22     ` Avery Pennarun
  2009-08-27 21:20   ` Junio C Hamano
  2 siblings, 1 reply; 17+ messages in thread
From: Björn Steinbrink @ 2009-08-27 16:46 UTC (permalink / raw
  To: Avery Pennarun; +Cc: Tom Lambda, git

On 2009.08.27 15:36:53 +0000, Avery Pennarun wrote:
> On Thu, Aug 27, 2009 at 3:30 PM, Tom Lambda<tom.lambda@gmail.com> wrote:
> > What was a little bit surprising to me is that running "git fetch central
> > master" does not update refs/remotes/central/master but simply updates
> > FETCH_HEAD.
> 
> I've often wanted this myself, especially when doing things like "git
> pull origin master".  However, I know the current behaviour is also
> useful sometimes, and changing it would introduce an unexpected side
> effect.  Git currently promises that your refs/remotes/* branches will
> never be updated unless you explicitly request it, even if you're
> fetching, merging, and pulling other stuff.  This means you can write
> scripts to do complicated things without triggering unexpected
> user-visible side effects.
> 
> So basically, I agree that it would often be much more user-friendly
> to do what you're asking.  But it would be less scripting-friendly.  I
> don't think anyone has thought of an answer that better balances the
> two.

It would also be pretty hard to implement that. Given the default fetch
refspec, it would "simply" be a matter of mapping the given ref to the
refspec, so e.g. "foo" becomes "refs/heads/foo:refs/remotes/origin/foo".
But even just using "git remote add -t master foo git://..." breaks
that, as the fetch refspec in the config will no longer be a glob, and
thus no such mapping is possible.

Björn

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

* Re: Question regarding git fetch
  2009-08-27 16:46   ` Björn Steinbrink
@ 2009-08-27 17:22     ` Avery Pennarun
  2009-08-27 20:48       ` Jeff King
  0 siblings, 1 reply; 17+ messages in thread
From: Avery Pennarun @ 2009-08-27 17:22 UTC (permalink / raw
  To: Björn Steinbrink; +Cc: Tom Lambda, git

2009/8/27 Björn Steinbrink <B.Steinbrink@gmx.de>:
> It would also be pretty hard to implement that. Given the default fetch
> refspec, it would "simply" be a matter of mapping the given ref to the
> refspec, so e.g. "foo" becomes "refs/heads/foo:refs/remotes/origin/foo".
> But even just using "git remote add -t master foo git://..." breaks
> that, as the fetch refspec in the config will no longer be a glob, and
> thus no such mapping is possible.

Hmm, I don't really see why that introduces a problem.  If you use -t
to override explicitly which refs you want to save, then it's not a
problem if git doesn't save other refs, right?

I'd be more concerned about the inconsistency between

   git fetch git://whatever master
and
   git fetch origin master

There's no really good way for the first one to know it needs to
update any branches, even though 'origin' might be an alias for
git://whatever.  So users will still be confused.

Thinking of that also reminds me of another surprise.  If you do:

   git fetch git://whatever

...it seems to do nothing at all, as far as I can see.  Which makes
sense, I guess, since I wouldn't really expect it to be meaningful.
But it seems to connect up to the remote server anyway just in case.

I suppose I have no useful suggestions here, other than an
interpretation of why users find the current behaviour confusing.

Have fun,

Avery

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

* Re: Question regarding git fetch
  2009-08-27 17:22     ` Avery Pennarun
@ 2009-08-27 20:48       ` Jeff King
  2009-08-27 21:34         ` Jeff King
  0 siblings, 1 reply; 17+ messages in thread
From: Jeff King @ 2009-08-27 20:48 UTC (permalink / raw
  To: Avery Pennarun; +Cc: Björn Steinbrink, Tom Lambda, git

On Thu, Aug 27, 2009 at 05:22:55PM +0000, Avery Pennarun wrote:

> 2009/8/27 Björn Steinbrink <B.Steinbrink@gmx.de>:
> > It would also be pretty hard to implement that. Given the default fetch
> > refspec, it would "simply" be a matter of mapping the given ref to the
> > refspec, so e.g. "foo" becomes "refs/heads/foo:refs/remotes/origin/foo".
> > But even just using "git remote add -t master foo git://..." breaks
> > that, as the fetch refspec in the config will no longer be a glob, and
> > thus no such mapping is possible.
> 
> Hmm, I don't really see why that introduces a problem.  If you use -t
> to override explicitly which refs you want to save, then it's not a
> problem if git doesn't save other refs, right?

I think you can handle both cases just by matching the fetched refs to
the LHS of the refspec.

So if you fetch "refs/heads/foo", and if you have a refspec of:

  refs/heads/*:refs/remotes/origin/*

then you see that the LHS glob matches, and the RHS expands to
refs/remotes/origin/foo. And if you have a more restrictive refspec,
that would work, too:

  refs/heads/foo:refs/remotes/origin/foo

would still match, but

  refs/heads/bar:refs/remotes/origin/bar

does not match on the LHS, so you write nothing. It would even handle
multiple refspecs properly.

And this matching is not really any different than what the fetch code
does when applying the refspec to what the remote offers. So I don't
think it should be any significant new code; it's just a matter of
activating that matching and updating the local tracking refs based on
what we actually fetched, instead of what the remote advertised.

> I'd be more concerned about the inconsistency between
> 
>    git fetch git://whatever master
> and
>    git fetch origin master
> 
> There's no really good way for the first one to know it needs to
> update any branches, even though 'origin' might be an alias for
> git://whatever.  So users will still be confused.

Well, you can always reverse-lookup each remote to see if the URL
matches. Of course you would never know that "http://whatever" is an
alias for "git://whatever". Personally, I don't imagine that users
really expect git to reverse-map remotes in that way (after all, why
would they input git://whatever long-hand if they knew that it was a
remote).

> Thinking of that also reminds me of another surprise.  If you do:
> 
>    git fetch git://whatever
> 
> ...it seems to do nothing at all, as far as I can see.  Which makes
> sense, I guess, since I wouldn't really expect it to be meaningful.
> But it seems to connect up to the remote server anyway just in case.

Shouldn't it fetch HEAD from the remote and store it in FETCH_HEAD? And
then tell you that it did that?

I get:

  $ mkdir foo && cd foo && git init
  Initialized empty Git repository in /home/peff/foo/.git/

  $ git fetch ~/compile/git
  remote: Counting objects: 85011, done.
  remote: Compressing objects: 100% (23942/23942), done.
  remote: Total 85011 (delta 61389), reused 83076 (delta 59655)
  Receiving objects: 100% (85011/85011), 19.03 MiB | 11385 KiB/s, done.
  Resolving deltas: 100% (61389/61389), done.
  From /home/peff/compile/git
   * branch            HEAD       -> FETCH_HEAD

  $ git fetch git://git.kernel.org/pub/scm/git/git.git
  From git://git.kernel.org/pub/scm/git/git
   * branch            HEAD       -> FETCH_HEAD

-Peff

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

* Re: Question regarding git fetch
  2009-08-27 15:36 ` Avery Pennarun
  2009-08-27 16:21   ` Eric Raible
  2009-08-27 16:46   ` Björn Steinbrink
@ 2009-08-27 21:20   ` Junio C Hamano
  2009-08-27 21:39     ` Jeff King
  2 siblings, 1 reply; 17+ messages in thread
From: Junio C Hamano @ 2009-08-27 21:20 UTC (permalink / raw
  To: Avery Pennarun; +Cc: Tom Lambda, git

Avery Pennarun <apenwarr@gmail.com> writes:

> On Thu, Aug 27, 2009 at 3:30 PM, Tom Lambda<tom.lambda@gmail.com> wrote:
>> What was a little bit surprising to me is that running "git fetch central
>> master" does not update refs/remotes/central/master but simply updates
>> FETCH_HEAD.
>
> I've often wanted this myself, especially when doing things like "git
> pull origin master".  However, I know the current behaviour is also
> useful sometimes, and changing it would introduce an unexpected side
> effect.  Git currently promises that your refs/remotes/* branches will
> never be updated unless you explicitly request it, even if you're
> fetching, merging, and pulling other stuff.  This means you can write
> scripts to do complicated things without triggering unexpected
> user-visible side effects.

I think it is reasonable, in 1.7.0, to change "git fetch" with command
line refspacs that lack colon (i.e. saying "fetch this ref" without saying
"and store it here") so that it updates remote tracking refs if and only
if an appropriate remote.$remote.fetch is configured to do so.  E.g. when
I fetch from Eric for git-svn updates with

	$ git pull git-svn master

because I do have

	[remote "git-svn"]
                url = git://yhbt.net/git-svn
                fetch = +refs/heads/*:refs/remotes/git-svn/*

defined, it is Ok to update refs/remotes/git-svn/master (but not others).

On the other hand, if my refspecs for "git svn" _were_ like this:

	[remote "git-svn"]
		url = git://yhbt.net/git-svn
                fetch = +refs/heads/master:refs/remotes/git-svn/master

then I would _not_ want this:

	$ git fetch git-svn dev

to create a new tracking branch refs/remotes/git-svn/dev.

It used to be that the only way to check the progress of other people
were to do this:

	$ git fetch git-svn master
	$ git log git-svn/master..FETCH_HEAD

But these days, even if we changed the "git fetch" semantics, we can still
rely on reflogs to do the equivalent with:

	$ git fetch git-svn
	$ git log git-svn/master@{1}..git-svn/master

In other words, I think the "feature" that an explicit "fetch but do not
store this time" request to prevent "git fetch" from updating the tracking
branches outlived its usefulness.

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

* Re: Question regarding git fetch
  2009-08-27 20:48       ` Jeff King
@ 2009-08-27 21:34         ` Jeff King
  2009-08-27 21:44           ` Junio C Hamano
  0 siblings, 1 reply; 17+ messages in thread
From: Jeff King @ 2009-08-27 21:34 UTC (permalink / raw
  To: Avery Pennarun; +Cc: Björn Steinbrink, Tom Lambda, git

On Thu, Aug 27, 2009 at 04:48:35PM -0400, Jeff King wrote:

> And this matching is not really any different than what the fetch code
> does when applying the refspec to what the remote offers. So I don't
> think it should be any significant new code; it's just a matter of
> activating that matching and updating the local tracking refs based on
> what we actually fetched, instead of what the remote advertised.

Sure enough, here is a really simple proof of concept. This is the first
time I have really looked into the fetch code, so I hope I'm not totally
breaking something else. :)

Basically it works like this. Both "git fetch remote" and "git fetch
remote refspec" work by making a "ref map" via get_ref_map. This is a
list of refs, with some refs having a "peer ref" that points to the
local counterpart. Those without a peer are just stored in FETCH_HEAD.
The function works by starting with a list of possible remote refs, and
then applying the refspecs to it.

Calling fetch without explicit refspecs means we will create the map
using the configured refspecs. Calling with commandline refspecs means
we will use those. So what this patch does is to first apply the
commandline refspecs to narrow the list, and then apply the configured
refspecs on top of that to make a new list, and then concatenate the
lists.

So you will end up with "two" refs to fetch, which just happen to match
the same source. One will go to FETCH_HEAD, and one will go to the
tracking ref. I.e.:

  $ git remote add origin ~/compile/git
  $ git fetch origin next
  From /home/peff/compile/git
   * branch            next       -> FETCH_HEAD
   * [new branch]      next       -> origin/next

And it should work the same if you supply a more interesting refspec,
too:

  $ git fetch -v origin next:foo
  From /home/peff/compile/git
   * [new branch]      next       -> foo
   = [up to date]      next       -> origin/next

or even a wildcard:

  $ git fetch -v origin refs/heads/*:refs/foo/*
  From /home/peff/compile/git
   * [new branch]      master     -> refs/foo/master
   * [new branch]      next       -> refs/foo/next
   * [new branch]      master     -> origin/master
   = [up to date]      next       -> origin/next

I haven't thought long enough to be convinced there aren't any bad side
effects, though. I guess if you had non-traditional configured refspecs,
you might be surprised to see them applied in this case. Something like:

  # we usually fetch the remote's master straight into our production
  # branch for deployment
  $ git config remote.origin.fetch refs/heads/master:refs/heads/production

  # but today let's demo it first
  $ git fetch origin master:demo

I don't know if people are actually using refspecs in that way. But we
do need to consider that this is a potentially destructive change.

Anyway, here is the patch.

---
diff --git a/builtin-fetch.c b/builtin-fetch.c
index 817dd6b..d9e44c7 100644
--- a/builtin-fetch.c
+++ b/builtin-fetch.c
@@ -119,6 +119,9 @@ static struct ref *get_ref_map(struct transport *transport,
 	const struct ref *remote_refs = transport_get_remote_refs(transport);
 
 	if (ref_count || tags == TAGS_SET) {
+		struct ref *tracking_refs = NULL;
+		struct ref **tracking_tail = &tracking_refs;
+
 		for (i = 0; i < ref_count; i++) {
 			get_fetch_map(remote_refs, &refs[i], &tail, 0);
 			if (refs[i].dst && refs[i].dst[0])
@@ -129,6 +132,12 @@ static struct ref *get_ref_map(struct transport *transport,
 			rm->merge = 1;
 		if (tags == TAGS_SET)
 			get_fetch_map(remote_refs, tag_refspec, &tail, 0);
+
+		for (i = 0; i < transport->remote->fetch_refspec_nr; i++)
+			get_fetch_map(ref_map, &transport->remote->fetch[i],
+					&tracking_tail, 0);
+		*tail = tracking_refs;
+		tail = tracking_tail;
 	} else {
 		/* Use the defaults */
 		struct remote *remote = transport->remote;

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

* Re: Question regarding git fetch
  2009-08-27 21:20   ` Junio C Hamano
@ 2009-08-27 21:39     ` Jeff King
  0 siblings, 0 replies; 17+ messages in thread
From: Jeff King @ 2009-08-27 21:39 UTC (permalink / raw
  To: Junio C Hamano; +Cc: Avery Pennarun, Tom Lambda, git

On Thu, Aug 27, 2009 at 02:20:46PM -0700, Junio C Hamano wrote:

> I think it is reasonable, in 1.7.0, to change "git fetch" with command
> line refspacs that lack colon (i.e. saying "fetch this ref" without saying
> "and store it here") so that it updates remote tracking refs if and only
> if an appropriate remote.$remote.fetch is configured to do so.  E.g. when
> I fetch from Eric for git-svn updates with
> 
> 	$ git pull git-svn master
> 
> because I do have
> 
> 	[remote "git-svn"]
>                 url = git://yhbt.net/git-svn
>                 fetch = +refs/heads/*:refs/remotes/git-svn/*

Does the colon really matter? That is, should

  $ git fetch git-svn master

store a tracking ref, but

  $ git fetch git-svn master:foo

not? In both cases, git has learned during the course of an operation
what the new value of the tracking ref could be, so why not store it?

The obstacle I see is that somebody may be using configured refspecs as
something other than a tracking ref. That is, they care about _when_
those refs on the RHS of the refspec are updated, and are not treating
them just as a cache of what the remote side has.

> On the other hand, if my refspecs for "git svn" _were_ like this:
> 
> 	[remote "git-svn"]
> 		url = git://yhbt.net/git-svn
>                 fetch = +refs/heads/master:refs/remotes/git-svn/master
> 
> then I would _not_ want this:
> 
> 	$ git fetch git-svn dev
> 
> to create a new tracking branch refs/remotes/git-svn/dev.

Of course not. It's not in your configured refspec, so you have
requested no such tracking ref. I think we would have to limit ourselves
to how the tracking refs are defined in the refspecs. Otherwise how
would we know to put the tracking ref in refs/remotes/git-svn and not
some other place?

So I think it is a simple matter of applying the configured refspecs
with information we happen to have gotten during the course of a
somewhat-related operation.

-Peff

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

* Re: Question regarding git fetch
  2009-08-27 21:34         ` Jeff King
@ 2009-08-27 21:44           ` Junio C Hamano
  2009-08-27 21:50             ` Jeff King
  0 siblings, 1 reply; 17+ messages in thread
From: Junio C Hamano @ 2009-08-27 21:44 UTC (permalink / raw
  To: Jeff King; +Cc: Avery Pennarun, Björn Steinbrink, Tom Lambda, git

Jeff King <peff@peff.net> writes:

>   # we usually fetch the remote's master straight into our production
>   # branch for deployment
>   $ git config remote.origin.fetch refs/heads/master:refs/heads/production
>
>   # but today let's demo it first
>   $ git fetch origin master:demo

I think this is a good example that any change results from this
discussion should apply _only_ to cases where command line refspecs lack
colon (i.e. used to mean "do not store this anywhere but in FETCH_HEAD").

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

* Re: Question regarding git fetch
  2009-08-27 21:44           ` Junio C Hamano
@ 2009-08-27 21:50             ` Jeff King
  2009-08-27 21:53               ` Jeff King
  2009-08-27 22:12               ` Avery Pennarun
  0 siblings, 2 replies; 17+ messages in thread
From: Jeff King @ 2009-08-27 21:50 UTC (permalink / raw
  To: Junio C Hamano; +Cc: Avery Pennarun, Björn Steinbrink, Tom Lambda, git

On Thu, Aug 27, 2009 at 02:44:54PM -0700, Junio C Hamano wrote:

> Jeff King <peff@peff.net> writes:
> 
> >   # we usually fetch the remote's master straight into our production
> >   # branch for deployment
> >   $ git config remote.origin.fetch refs/heads/master:refs/heads/production
> >
> >   # but today let's demo it first
> >   $ git fetch origin master:demo
> 
> I think this is a good example that any change results from this
> discussion should apply _only_ to cases where command line refspecs lack
> colon (i.e. used to mean "do not store this anywhere but in FETCH_HEAD").

I don't think the colon is the issue. Consider the same situation, but I
say:

  # but today let's demo it first
  $ git fetch origin master
  $ git checkout -b demo FETCH_HEAD

I'm still screwed. The issue is that you consider your configured
refspec destinations to be precious, and not merely a cache for what's
happening on the remote side.

-Peff

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

* Re: Question regarding git fetch
  2009-08-27 21:50             ` Jeff King
@ 2009-08-27 21:53               ` Jeff King
  2009-08-27 22:12               ` Avery Pennarun
  1 sibling, 0 replies; 17+ messages in thread
From: Jeff King @ 2009-08-27 21:53 UTC (permalink / raw
  To: Junio C Hamano; +Cc: Avery Pennarun, Björn Steinbrink, Tom Lambda, git

On Thu, Aug 27, 2009 at 05:50:07PM -0400, Jeff King wrote:

> > I think this is a good example that any change results from this
> > discussion should apply _only_ to cases where command line refspecs lack
> > colon (i.e. used to mean "do not store this anywhere but in FETCH_HEAD").
> 
> I don't think the colon is the issue. Consider the same situation, but I
> say:
> 
>   # but today let's demo it first
>   $ git fetch origin master
>   $ git checkout -b demo FETCH_HEAD
> 
> I'm still screwed. The issue is that you consider your configured
> refspec destinations to be precious, and not merely a cache for what's
> happening on the remote side.

Which, btw, led me to consider whether there are heuristics for deciding
when a fetch refspec means one thing and not the other. I don't think
there are reliable ones (probably the default configured
refs/remotes/$remotename/* would not yield false positives, but I think
limiting to that would yield false negatives). So maybe this is
something that should be configurable, disabled by default for now, and
maybe enabled by default in the future (v1.7.0?).

-Peff

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

* Re: Question regarding git fetch
  2009-08-27 21:50             ` Jeff King
  2009-08-27 21:53               ` Jeff King
@ 2009-08-27 22:12               ` Avery Pennarun
  2009-08-27 22:16                 ` Jeff King
  1 sibling, 1 reply; 17+ messages in thread
From: Avery Pennarun @ 2009-08-27 22:12 UTC (permalink / raw
  To: Jeff King; +Cc: Junio C Hamano, Björn Steinbrink, Tom Lambda, git

On Thu, Aug 27, 2009 at 9:50 PM, Jeff King<peff@peff.net> wrote:
> I don't think the colon is the issue. Consider the same situation, but I
> say:
>
>  # but today let's demo it first
>  $ git fetch origin master
>  $ git checkout -b demo FETCH_HEAD
>
> I'm still screwed. The issue is that you consider your configured
> refspec destinations to be precious, and not merely a cache for what's
> happening on the remote side.

Is the "precious remote ref" concept perhaps an imaginary one?

After all, if I *really* care about the prior state of the remote, I
can just make it a remote branch.  And if (as often happens) I just
want to know what's new in that ref since last time I merged, it's
simply

   git log master..origin/master

This works even if master has extra commits vs. origin/master, since
the double-dot invokes git-merge-base.

I think this might be a much more common than the case where people
actually want to see "what's changed since last time I checked what's
changed."  At least, the latter question has never been very
interesting to me, or if it is, it's easy for me to tell by eye.

Avery

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

* Re: Question regarding git fetch
  2009-08-27 22:12               ` Avery Pennarun
@ 2009-08-27 22:16                 ` Jeff King
  2009-08-27 22:24                   ` Avery Pennarun
  0 siblings, 1 reply; 17+ messages in thread
From: Jeff King @ 2009-08-27 22:16 UTC (permalink / raw
  To: Avery Pennarun; +Cc: Junio C Hamano, Björn Steinbrink, Tom Lambda, git

On Thu, Aug 27, 2009 at 10:12:50PM +0000, Avery Pennarun wrote:

> > I'm still screwed. The issue is that you consider your configured
> > refspec destinations to be precious, and not merely a cache for what's
> > happening on the remote side.
> 
> Is the "precious remote ref" concept perhaps an imaginary one?

Maybe. I certainly don't use it. But I am trying to consider corner
cases where somebody who _isn't_ me is going to get screwed by a
change we make.

> After all, if I *really* care about the prior state of the remote, I
> can just make it a remote branch.  And if (as often happens) I just

Do you mean "local branch" here?

> want to know what's new in that ref since last time I merged, it's
> simply
> 
>    git log master..origin/master
> 
> This works even if master has extra commits vs. origin/master, since
> the double-dot invokes git-merge-base.

Well, ".." doesn't use git-merge-base. But yes, I actually do this,
except I do:

  gitk master...origin/master

-Peff

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

* Re: Question regarding git fetch
  2009-08-27 22:16                 ` Jeff King
@ 2009-08-27 22:24                   ` Avery Pennarun
  0 siblings, 0 replies; 17+ messages in thread
From: Avery Pennarun @ 2009-08-27 22:24 UTC (permalink / raw
  To: Jeff King; +Cc: Junio C Hamano, Björn Steinbrink, Tom Lambda, git

On Thu, Aug 27, 2009 at 10:16 PM, Jeff King<peff@peff.net> wrote:
> On Thu, Aug 27, 2009 at 10:12:50PM +0000, Avery Pennarun wrote:
>> After all, if I *really* care about the prior state of the remote, I
>> can just make it a remote branch.  And if (as often happens) I just
>
> Do you mean "local branch" here?

Yes.

>> want to know what's new in that ref since last time I merged, it's
>> simply
>>
>>    git log master..origin/master
>>
>> This works even if master has extra commits vs. origin/master, since
>> the double-dot invokes git-merge-base.
>
> Well, ".." doesn't use git-merge-base. But yes, I actually do this,
> except I do:
>
>  gitk master...origin/master

Sorry, not my day for accuracy, it seems.  I use both, and I should
have remembered that the triple-dot is the one that worries about the
merge-base.

Have fun,

Avery

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

* Re: Question regarding git fetch
  2009-08-27 15:30 Question regarding git fetch Tom Lambda
  2009-08-27 15:36 ` Avery Pennarun
@ 2009-08-28 13:24 ` Tom Lambda
  1 sibling, 0 replies; 17+ messages in thread
From: Tom Lambda @ 2009-08-28 13:24 UTC (permalink / raw
  To: git


Thank you all for your answers and the interesting following discussion.

>From a user perspective (I do not know how git works internally), the
approach proposed by Juno looks very intuitive to me. Now I understand there
are other cases and users to take into account, which make the
implementation complex. I hope this will be part of git 1.7.0.

--Tom

-- 
View this message in context: http://n2.nabble.com/Question-regarding-git-fetch-tp3527289p3534609.html
Sent from the git mailing list archive at Nabble.com.

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

end of thread, other threads:[~2009-08-28 13:24 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-08-27 15:30 Question regarding git fetch Tom Lambda
2009-08-27 15:36 ` Avery Pennarun
2009-08-27 16:21   ` Eric Raible
2009-08-27 16:28     ` Avery Pennarun
2009-08-27 16:46   ` Björn Steinbrink
2009-08-27 17:22     ` Avery Pennarun
2009-08-27 20:48       ` Jeff King
2009-08-27 21:34         ` Jeff King
2009-08-27 21:44           ` Junio C Hamano
2009-08-27 21:50             ` Jeff King
2009-08-27 21:53               ` Jeff King
2009-08-27 22:12               ` Avery Pennarun
2009-08-27 22:16                 ` Jeff King
2009-08-27 22:24                   ` Avery Pennarun
2009-08-27 21:20   ` Junio C Hamano
2009-08-27 21:39     ` Jeff King
2009-08-28 13:24 ` Tom Lambda

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).