git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Michael J Gruber <git@drmicha.warpmail.net>
To: Jeff King <peff@peff.net>
Cc: Paolo Ciarrocchi <paolo.ciarrocchi@gmail.com>,
	git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>
Subject: Re: [question] how can i verify whether a local branch is tracking a remote branch?
Date: Mon, 06 Apr 2009 14:00:34 +0200	[thread overview]
Message-ID: <49D9EEE2.3000607@drmicha.warpmail.net> (raw)
In-Reply-To: <20090406043426.GC12341@coredump.intra.peff.net>

Jeff King venit, vidit, dixit 06.04.2009 06:34:
> On Sun, Apr 05, 2009 at 11:25:29PM +0200, Paolo Ciarrocchi wrote:
> 
>> An example:
>> $ git clone -n URL temp
>> $ cd temp
>> $ git branch -r
>>   origin/master
>>   origin/foo
>>   Origin/bar
>> $ git checkout --track -b foo origin/foo
>>
>> Now, how can I know that foo is tracking origin/foo ?
> 
> Doing it right is hard. You have to:
> 
>   1. check branch.foo.merge and branch.foo.rebase; if no value, it is not
>      tracking anything; if it is, remember that value as $m
> 
>   2. check branch.foo.remote for the remote name, $r
> 
>   3. check the fetch refspecs for remote $r; these can come from
>      the config, or from .git/remotes/* files. Maybe even .git/branches
>      files; I don't even remember how those work.
> 
>   4. find the refspec that fetches from $m; then find the matching
>      destination for that refspec. That is the tracking branch.
> 
> E.g., in your example (and using a modern git):
> 
>   1. $m is refs/heads/foo
>   2. $r is origin
>   3. The fetch refspec is in remote.origin.fetch, and is generally
>      "refs/heads/*:refs/remotes/origin/*"
>   4. So refs/heads/foo becomes refs/remotes/origin/foo.
>      refs/remotes/origin/foo is your tracking branch.
> 
> Steps 1 and 2 are easy, but 3 and 4 are a bit nasty. You can fake it by
> assuming that "refs/heads/$m" on "$r" is always "refs/remotes/$r/$m",
> which is true for very vanilla setups.
> 
> There is C code that does this, but there is not a good way of accessing
> it from the command-line. The best you can do is "git remote show
> origin", which on recent git versions should show something like:
> 
>   ...
>   Local branches configured for 'git pull':
>     foo    merges with remote foo
>   ...
> 
> But of course that implies that you already guessed the remote "origin".
> And it's not using plumbing, so it's not very suitable for scripts.
> 
> I don't think it would be unreasonable to expose this functionality via
> "for-each-ref". Something like this (which would need cleanup,
> documentation, and perhaps a :short variant):
> 
> ---
> diff --git a/builtin-for-each-ref.c b/builtin-for-each-ref.c
> index 5cbb4b0..3f418e4 100644
> --- a/builtin-for-each-ref.c
> +++ b/builtin-for-each-ref.c
> @@ -8,6 +8,7 @@
>  #include "blob.h"
>  #include "quote.h"
>  #include "parse-options.h"
> +#include "remote.h"
>  
>  /* Quoting styles */
>  #define QUOTE_NONE 0
> @@ -66,6 +67,7 @@ static struct {
>  	{ "subject" },
>  	{ "body" },
>  	{ "contents" },
> +	{ "tracking" },
>  };
>  
>  /*
> @@ -699,6 +701,18 @@ static void populate_value(struct refinfo *ref)
>  				v->s = s;
>  			}
>  		}
> +		if (!strcmp(name, "tracking")) {
> +			struct branch *branch;
> +			if (prefixcmp(ref->refname, "refs/heads/"))
> +				continue;
> +			branch = branch_get(ref->refname + 11);
> +			if (branch && branch->merge && branch->merge[0] &&
> +			    branch->merge[0]->dst)
> +				v->s = branch->merge[0]->dst;

Isn't that missing out on those cases where you --track (i.e. follow) a
local (upstream) branch? See
5e6e2b4 (Make local branches behave like remote branches when --tracked,
2009-04-01)

> +			else
> +				v->s = NULL;
> +			free(branch); /* XXX should also free other parts? */
> +		}
>  	}
>  
>  	grab_values(ref->value, 0, obj, buf, size);
> 
> 
> 
> 
> 

If we hook it up into git-branch there would be to useful directions:

- "git branch --follows foo" could list all branches which follow foo,
analogous to --contains. It gives you all your feature work on top of
foo, all branches affected by rebasing foo etc.

- "git branch --whatever foo" could list the branch whoch foo follows.

I just notices that "git branch -v foo" does not give me the "-v" output
for foo... Improving that would open up the possibility to go for -vv foo.

Michael

  parent reply	other threads:[~2009-04-06 12:02 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-05 10:32 [question] how can i verify whether a local branch is tracking a remote branch? Paolo Ciarrocchi
2009-04-05 14:44 ` Jeff King
2009-04-05 21:25   ` Paolo Ciarrocchi
2009-04-06  4:34     ` Jeff King
2009-04-06  5:28       ` Junio C Hamano
2009-04-06  5:49         ` Jeff King
2009-04-06  8:30       ` Paolo Ciarrocchi
2009-04-06 21:25         ` Jeff King
2009-04-06 22:00           ` Paolo Ciarrocchi
2009-04-07  4:41             ` Jeff King
2009-04-06 12:00       ` Michael J Gruber [this message]
2009-04-06 21:29         ` Jeff King
2009-04-07  7:59           ` Michael J Gruber

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=49D9EEE2.3000607@drmicha.warpmail.net \
    --to=git@drmicha.warpmail.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=paolo.ciarrocchi@gmail.com \
    --cc=peff@peff.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).