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

Re: [RFC] make --set-upstream work for local branches not in refs/heads

From
Krzesimir Nowak <krzesimir@endocode.com>
Date
Mar 6, 2014, 09:27 UTC
Message-ID
<1394098048.2050.19.camel@localhost.localdomain>
In-Reply-To
<xmqqlhwpkats.fsf@gitster.dls.corp.google.com>
On Tue, 2014-03-04 at 11:44 -0800, Junio C Hamano wrote:
Show 30 quoted lines
> Krzesimir Nowak <krzesimir@endocode.com> writes:
> 
> > It might be possible (in "Gerrited" setups) to have local branches
> > outside refs/heads/, like for example in following fetch config:
> >
> > [remote "origin"]
> > 	url = ssh://user@example.com/my-project
> > 	fetch = +refs/heads/*:refs/remotes/origin/*
> > 	fetch = +refs/wip/*:refs/remotes/origin-wip/*
> >
> > Let's say that 'test' branch already exist in origin/refs/wip/. If I
> > call:
> >
> > git checkout test
> >
> > then it will create a new branch and add an entry to .git/config:
> >
> > [branch "test"]
> > 	remote = origin
> > 	merge = refs/wip/test
> >
> > But if I create a branch 'test2' and call:
> >
> > git push --set-upstream origin test2:refs/wip/test2
> >
> > then branch is pushed, but no entry in .git config is created.
> 
> By definition anything otuside refs/heads/ is not a branch, so do
> not call things in refs/wip "branches".  Retitle it to "work for
> local refs outside refs/heads" or something.
I always have problems with proper use of git's terminology. Sorry.
Show 12 quoted lines
> 
> Having said that, I do not see a major problem if we allowed
> 
> 	[branch "test2"]
> 		remote = origin
>                 merge = refs/wip/test2
> 
> to be created when "push --setupstream" is requested, making
> test2@{upstream} to point at refs/remotes/origin-wip/test2.
> 
> I do not know what the correct implementation of such a feature
> should be, though.

Hm, have some idea about it, though I will leave its sanity to judge to you.

Given the following config snippet:
[remote "origin"]
	url = ssh://user@example.com/my-project
	fetch = +refs/heads/*:refs/remotes/origin/*
	fetch = +refs/wip/*:refs/remotes/origin-wip/*

We could have get_local_ref_hierarchies function defined somewhat as follows (memory management details are left out):

char **get_local_ref_hierarchies(char *remote)
{
	char **refspecs = get_fetch_refspecs_for_remote (remote);
	char **iter;
	char **local = NULL;
	for (iter = refspecs; iter && *iter; ++iter) {
		char *src = get_src_refspec_part (*iter);
		push (&local, src);
	}
	/* maybe filter dups and make refs/heads/ first */
	return local;
}
I'm sure that there are some corner-cases this code does not handle.

Also, maybe it would be good to add some information when --set-upstream does nothing. Something like after doing "git push --set-upstream origin test:refs/wip/test":

""" Could not set temp to track refs/wip/test. Either call: git config branch.test.remote origin git config branch.test.merge refs/wip/test

or (this part would appear if this solution in patch is accepted)

git config --add remote.origin.fetch \ "+refs/wip/*:refs/remotes/origin-wip/* """

Cheers,
-- 
Krzesimir Nowak
Software Developer
Endocode AG

krzesimir@endocode.com

------
Endocode AG, Johannisstraße 20, 10117 Berlin
info@endocode.com | www.endocode.com

Vorstandsvorsitzender: Mirko Boehm
Vorstände: Dr. Karl Beecher, Chris Kühl, Sebastian Sucker
Aufsichtsratsvorsitzende: Jennifer Beecher

Registergericht: Amtsgericht Charlottenburg - HRB 150748 B
Previous: Junio C Hamano
Message 4 of 4 in “[RFC] make --set-upstream work for local branches not in refs/heads”
  1. Krzesimir NowakMar 4, 2014
  2. RFC: make --set-upstream work for branches not in refs/heads/Krzesimir Nowak, Mar 4, 2014
  3. Junio C HamanoMar 4, 2014
  4. Krzesimir NowakMar 6, 2014

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.