git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [RFC PATCH 1/2] git-branch: allow --track to work w/local branches

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 16, 2008, 05:10 UTC
Message-ID
<7v7ih5fpve.fsf@gitster.siamese.dyndns.org>
In-Reply-To
<1203133557-50013-1-git-send-email-jaysoffian@gmail.com>
Jay Soffian <jaysoffian@gmail.com> writes:
Show 21 quoted lines
> diff --git a/builtin-branch.c b/builtin-branch.c
> index e414c88..94ab195 100644
> --- a/builtin-branch.c
> +++ b/builtin-branch.c
> @@ -402,6 +402,16 @@ static int setup_tracking(const char *new_ref, const char *orig_ref)
>  		return error("Tracking not set up: name too long: %s",
>  				new_ref);
>  
> +	if (!prefixcmp(orig_ref, "refs/heads/")) {
> +		sprintf(key, "branch.%s.remote", new_ref);
> +		git_config_set(key, ".");
> +		sprintf(key, "branch.%s.merge", new_ref);
> +		git_config_set(key, orig_ref);
> +		printf("Branch %s set up to track local branch %s.\n",
> +			       new_ref, orig_ref);
> +		return 0;
> +	}
> +
>  	memset(&tracking, 0, sizeof(tracking));
>  	tracking.spec.dst = (char *)orig_ref;
>  	if (for_each_remote(find_tracked_branch, &tracking) ||

Although I am not so familiar with this area, the patch somehow did not feel right, so I ended up doing a bit of digging.

After the context of the patch, we have this:
	if (tracking.matches == 1) {
		sprintf(key, "branch.%s.remote", new_ref);
		git_config_set(key, tracking.remote ?  tracking.remote : ".");
		sprintf(key, "branch.%s.merge", new_ref);
		git_config_set(key, tracking.src);

So it looks to me that the code already has intention to set the "branch.*.remote" variable to "." when certain condition is met. And the condition is "when tracking.remote is NULL, or it is already a dot".

for_each_remote() iterates thru the remotes and find_tracked_branch() does this:

        static int find_tracked_branch(struct remote *remote, void *priv)
        {
                struct tracking *tracking = priv;
                if (!remote_find_tracking(remote, &tracking->spec)) {
                        if (++tracking->matches == 1) {
                                tracking->src = tracking->spec.src;
                                tracking->remote = remote->name;
                        } else {
                                free(tracking->spec.src);
                                if (tracking->src) {
                                        free(tracking->src);
                                        tracking->src = NULL;
                                }
                        }
                        tracking->spec.src = NULL;
                }
                return 0;
        }

So if there is a remote whose name is "." (or NULL, but I do not know when that can happen --- remote.c::make_remote() does not allow creating such a remote as far as I can tell), that would be found without the added extra code, wouldn't it?

I did a bit of experiment and with this in .git/config:
	[remote "."]
                fetch = refs/*:refs/*

it turns out that you do not have to patch the code at all. The above manual configuration feels somewhat like an ugly hack but perhaps we should make the above two lines implied? This area was last cleaned up in 6f084a5 (branch --track: code cleanup and saner handling of local branches). I do not know if the original intention of the code was to allow a hack like this to work, or it is just an unintended accident that it happens to work. Dscho, any ideas?

Previous: Jay SoffianNext: Jay Soffian
Message 3 of 6 in “git-branch: allow --track to work w/local branches”
  1. 1/2 git-branch: allow --track to work w/local branchesJay Soffian, Feb 16, 2008
  2. 2/2 new --rebase option to set branch.*.rebase for new branchesJay Soffian, Feb 16, 2008
  3. Junio C HamanoFeb 16, 2008
  4. Jay SoffianFeb 16, 2008
  5. Johannes SchindelinFeb 16, 2008
  6. Jay SoffianFeb 17, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.