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

Re: [PATCH 0/3] Unconfuse git clone when two branches at are HEAD.

From
Philip Oakley <philipoakley@iee.org>
Date
Sep 7, 2013, 19:19 UTC
Message-ID
<531DBE1FF66D4356AEE6AEE5C2FE9389@PhilipOakley>
In-Reply-To
<xmqqwqmsvdfh.fsf@gitster.dls.corp.google.com>
From: "Junio C Hamano" <gitster@pobox.com>
Sent: Saturday, September 07, 2013 4:50 PM
Show 32 quoted lines
> "Philip Oakley" <philipoakley@iee.org> writes:
>> From: "Junio C Hamano" <gitster@pobox.com>
>>> "Philip Oakley" <philipoakley@iee.org> writes:
>>>
>>>> Does this have any impact on the alleged bug in `git bundle --all`
>>>> (which can then be cloned from) where the current HEAD ref wasn't
>>>> included in the bundle? Or am I mis-remembering?
>>>
>>> Not "current HEAD ref", but "git clone" will fail to check out from
>>> a bundle that does not include HEAD ref (it is easy to just say
>>> "reset --hard master" or whatever after it, though).
>>>
>>> I think I suggested to update "git bundle" to include HEAD when
>>> there is no HEAD specified some time ago, but I do not think anybody
>>> was interested, so this may be a non-issue.
>>>
>> Just had a quick look at a very quick test repo (10 objects, 2
>> branches) and the bundle file does contain the HEAD ref, but again it
>> has the two ref/heads/* are better than one problem, in that the 
>> clone
>> from the bundle checks out master, whilst the source repo has feature
>> checked out.
>
> I do not think the bundle header records symref any differently from
> other refs, so a HEAD that points at a commit that is at the tip of
> more than one ref needs to be guessed at the extraction end, just
> like the network-transfer case discussed in this thread.
>
> But this thread is not about updating the current bundle format to a
> new one, so any of the updates proposed in these patches will not
> affect it.
> --

I was having a quick look at the different bundle/clone routes and tried out (on 1.8.1.msysgit.1) the following script to see the differences (probably word wrap damaged):

--- cd /c/ # if on Windows to be at the top of c:/ mkdir gitBundleTest1 cd gitBundleTest1 git init echo AAA >a.txt git add a.txt git commit -mfirst git checkout -b feature git checkout -b zulu # does this, alphabetically after master, change anything? git status # observe on 'feature' branch # one repo, one file, one commit, two branches

# test the bundle - clone transfer git bundle create Repo.bundle --all git clone Repo.bundle ../gitBundleTest2 cd ../gitBundleTest2 git status # observe on wrong branch

# back to original repo cd ../gitBundleTest1 # test the direct clone transfer git clone . ../gitBundleTest3 cd ../gitBundleTest3 git status # observe on wrong branch again

# back to top level (wherever that is on Msys Windows ;-) cd .. pwd # test the git protocol clone transfer # it's file:// followed by abolute path /path/to/dir so ... # but note msys windows /c/ git clone file:///c/gitBundleTest1 ./gitBundleTest4 cd ./gitBundleTest4 git status # observe on wrong branch again

cd ~ # return home ---

What I observed was that all the clones had the same HEAD problem, which I think comes from clone.c: guess_remote_head().

When I looked in the Repo.bundle file I saw the refs/heads/* listed in alphabetic order followed by HEAD, all with the same sha1 (in this case), followed by PACK and then the binary data.

My quick look at clone.c suggested to me that there would be a lot of commonality between the bundle data stream and the transport streams (identical?), and it was just a case of adding into the bundle data the same HEAD symref indication that would solve the normal clone problem (including backward compatibility). Is that a reasonable assesssment?

Philip
Previous: Junio C HamanoNext: Junio C Hamano
Message 26 of 32 in “Unconfuse git clone when two branches at are HEAD.”
  1. 0/3 Unconfuse git clone when two branches at are HEAD.Andreas Krey, Sep 6, 2013
  2. 1/3 upload-pack: send the HEAD informationAndreas Krey, Sep 6, 2013
  3. Junio C HamanoSep 6, 2013
  4. Andreas KreySep 6, 2013
  5. Junio C HamanoSep 6, 2013
  6. Jeff KingSep 8, 2013
  7. Jeff KingSep 8, 2013
  8. Junio C HamanoSep 8, 2013
  9. 0/6 Removing the guesswork of HEAD in "clone"Junio C Hamano, Sep 18, 2013
  10. 1/6 upload-pack.c: do not pass confusing cb_data to mark_our_ref()Junio C Hamano, Sep 18, 2013
  11. 2/6 upload-pack: send symbolic ref information as capabilityJunio C Hamano, Sep 18, 2013
  12. Junio C HamanoSep 18, 2013
  13. 3/6 upload-pack: send non-HEAD symbolic refsJunio C Hamano, Sep 18, 2013
  14. 4/6 connect.c: make parse_feature_value() staticJunio C Hamano, Sep 18, 2013
  15. 5/6 connect: annotate refs with their symref information in get_remote_head()Junio C Hamano, Sep 18, 2013
  16. 6/6 clone: test the new HEAD detection logicJunio C Hamano, Sep 18, 2013
  17. 2/3 connect.c: save symref info from server capabilitiesAndreas Krey, Sep 6, 2013
  18. Junio C HamanoSep 6, 2013
  19. Andreas KreySep 6, 2013
  20. Junio C HamanoSep 6, 2013
  21. 3/3 clone: test the new HEAD detection logicAndreas Krey, Sep 6, 2013
  22. Philip OakleySep 6, 2013
  23. Junio C HamanoSep 6, 2013
  24. Philip OakleySep 6, 2013
  25. Junio C HamanoSep 7, 2013
  26. Philip OakleySep 7, 2013
  27. Junio C HamanoSep 8, 2013
  28. Philip OakleySep 8, 2013
  29. Junio C HamanoSep 9, 2013
  30. Andreas KreySep 9, 2013
  31. Philip OakleySep 9, 2013
  32. Junio C HamanoSep 9, 2013

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.