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

Re: [PATCH 3/3] clone: always fetch remote HEAD

From
Jeff King <peff@peff.net>
Date
Jun 6, 2011, 22:08 UTC
Message-ID
<20110606220821.GB13697@sigill.intra.peff.net>
In-Reply-To
<7vipsi8zwl.fsf@alter.siamese.dyndns.org>
On Mon, Jun 06, 2011 at 01:31:54PM -0700, Junio C Hamano wrote:
Show 11 quoted lines
> >  static struct ref *wanted_peer_refs(const struct ref *refs,
> >  		struct refspec *refspec)
> >  {
> > -	struct ref *local_refs = NULL;
> > -	struct ref **tail = &local_refs;
> > +	struct ref *head = get_remote_ref(refs, "HEAD");
> 
> The rest of the patch looked quite sane but I wonder if this should be
> using get_remote_ref() that calls find_ref_by_name_abbrev() which in turn
> would hit "refs/heads/HEAD" if the remote side didn't give you "HEAD".
> Shouldn't it be using find_ref_by_name() directly?

Ick, yeah, that was just me blindly cutting down what get_fetch_map was doing to the bit that I wanted, and thinking get_remote_ref was it. I didn't even notice the fact that it was using the _abbrev form of find_ref_by_name.

It should definitely be an exact match. I'll fix it in my re-roll.
Show 15 quoted lines
> > @@ -357,8 +358,11 @@ static void write_remote_refs(const struct ref *local_refs)
> >  {
> >  	const struct ref *r;
> >  
> > -	for (r = local_refs; r; r = r->next)
> > +	for (r = local_refs; r; r = r->next) {
> > +		if (!r->peer_ref)
> > +			continue;
> 
> As this is part of this patch, I presume this test reliably catch "HEAD"
> and only "HEAD", but what is it that gives us this guarantee?  Is it that
> in all three possible configurations (i.e. traditional no-separate remote
> layout, separate remote layout, or mirrored layout), we never map anything
> outside refs/heads/* and refs/tags/* namespace, hence things like HEAD
> will never have peer_ref defined?

Until now, nobody fed us a ref without peer_ref mapped, as doing so would segfault. So this gives a NULL peer ref the meaning "don't bother saving this into a ref". Which is really the only sensible thing it can mean, since the peer ref is the local bit that says where to put it.

> This is not a complaint but is an honest question. I am wondering how
> future possible enhancements to "clone" (like the rumored "track only this
> branch") will affect codepaths around this area.

I think it's a good question to ask. The answer is that if you are cloning only a subset of the remote refs (or even a single ref), then either:

  1. You will want to write that subset according to a refspec mapping
     (e.g., cloning "jk/*" to "remotes/origin/jk/*"). In that case you
     would have set the peer_ref to show where to put it.
  2. You will not want to write out these refs, because you are handling
     them separately. For example, in this case, we are already handling
     the detached HEAD case separately when we generally figure out what
     HEAD is. And in this case, the code does what you want by silently
     skipping.
     I tried to think of another case where you would want this, but I
     really couldn't come up with one. Even if you are cloning a "track
     only this branch" ref, you would still have its peer_ref pointing
     to its local counterpart (even if it's "refs/heads/master" both
     locally and on the remote).
-Peff
Previous: Junio C HamanoNext: Jeff King
Message 55 of 65 in “git clone (ssh://) skips detached HEAD”
  1. Dmitry IvankovJun 1, 2011
  2. Jeff KingJun 1, 2011
  3. Dmitry IvankovJun 1, 2011
  4. Junio C HamanoJun 1, 2011
  5. Jeff KingJun 1, 2011
  6. Jeff KingJun 1, 2011
  7. Jeff KingJun 3, 2011
  8. 1/3 t: add tests for cloning remotes with detached HEADJeff King, Jun 3, 2011
  9. 2/3 consider only branches in guess_remote_headJeff King, Jun 3, 2011
  10. 3/3 clone: always fetch remote HEADJeff King, Jun 3, 2011
  11. Sverre RabbelierJun 3, 2011
  12. Jeff KingJun 3, 2011
  13. Jeff KingJun 3, 2011
  14. Junio C HamanoJun 3, 2011
  15. Jeff KingJun 3, 2011
  16. Sverre RabbelierJun 4, 2011
  17. Jeff KingJun 6, 2011
  18. Junio C HamanoJun 6, 2011
  19. Junio C HamanoJun 6, 2011
  20. Sverre RabbelierJun 6, 2011
  21. Junio C HamanoJun 6, 2011
  22. Jeff KingJun 6, 2011
  23. Sverre RabbelierJun 6, 2011
  24. Jeff KingJun 7, 2011
  25. Sverre RabbelierJun 7, 2011
  26. 0/8 minor import/export remote helper fixesJeff King, Jun 7, 2011
  27. 1/8 transport-helper: fix minor leak in push_refs_with_exportJeff King, Jun 7, 2011
  28. 2/8 git-remote-testgit: exit gracefully after pushJeff King, Jun 7, 2011
  29. Sverre RabbelierJun 7, 2011
  30. 3/8 t5800: factor out some ref testsJeff King, Jun 7, 2011
  31. Sverre RabbelierJun 7, 2011
  32. 4/8 t5800: document some non-functional parts of remote helpersJeff King, Jun 7, 2011
  33. Sverre RabbelierJun 7, 2011
  34. Jeff KingJun 7, 2011
  35. Sverre RabbelierJun 7, 2011
  36. Jeff KingJun 7, 2011
  37. Sverre RabbelierJun 7, 2011
  38. Jeff KingJun 7, 2011
  39. Junio C HamanoJun 8, 2011
  40. Jeff KingJun 9, 2011
  41. Junio C HamanoJun 9, 2011
  42. Jeff KingJun 9, 2011
  43. Sverre RabbelierJun 9, 2011
  44. 5/8 teach remote-testgit to import non-HEAD refsJeff King, Jun 7, 2011
  45. Junio C HamanoJun 8, 2011
  46. Jeff KingJun 9, 2011
  47. 6/8 teach remote-testgit to import multiple refsJeff King, Jun 7, 2011
  48. 7/8 transport-helper: don't feed bogus refs to export pushJeff King, Jun 7, 2011
  49. Sverre RabbelierJun 7, 2011
  50. 8/8 git_remote_helpers: push all refs during a non-local exportJeff King, Jun 7, 2011
  51. Sverre RabbelierJun 7, 2011
  52. Jeff KingJun 7, 2011
  53. Sverre RabbelierJun 7, 2011
  54. Junio C HamanoJun 6, 2011
  55. Jeff KingJun 6, 2011
  56. Jeff KingJun 7, 2011
  57. 1/2 make copy_ref globally availableJeff King, Jun 7, 2011
  58. 2/2 clone: always fetch remote HEADJeff King, Jun 7, 2011
  59. Junio C HamanoJun 7, 2011
  60. Junio C HamanoJun 3, 2011
  61. Jeff KingJun 3, 2011
  62. Jakub NarebskiJun 1, 2011
  63. Jeff KingJun 1, 2011
  64. Jakub NarebskiJun 2, 2011
  65. Jeff KingJun 3, 2011

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.