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

Re: cg-clone, tag objects and cg-push/git-push don't play nice

From
Junio C Hamano <junkio@cox.net>
Date
Oct 19, 2005, 08:52 UTC
Message-ID
<7vbr1ldh30.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<46a038f90510190110g53c90c5t419ad6065292269e@mail.gmail.com>
Martin Langhoff <martin.langhoff@gmail.com> writes:
Show 7 quoted lines
>> That is expected.
>
> Hmmm. I was under the impression that if I call git-push naming a
> particular head, it could restrict itself to the stuff needed for that
> head only. Just to clarify, I'm running
>
>   git-push locke.catalyst.net.nz:/var/git/moodle-test.git master:mdl-topnz-prod

Yeah. But the problem is that the repository on the other end claims that it has everything reachable from those incomplete tags. Hearing that, git-push (the real name of it is send-pack) decides not to send things that are already reachable from the refs the other end claims to have. So if an incomplete tag refers to a commit that contains a blob that the remote actually does not have, and if that blob is part of the head you are pushing, send-pack would not (and should not) send that blob to the remote.

Show 8 quoted lines
>> I do not understand why removing .git/refs/tags/* did not help,
>> and that is the biggest thing that disturbs me in this whole
>> problem report
>
> I can't understand that either, but I manually removed all the
> refs/tags, and the only heads I have are origin and master. git-push
> won't let me do it until the exact point where I have removed the
> object from the repo. And that's only possible on unpacked repos.
Hmph.  It worries me even more.
This error message:
      error: unpack should have generated
    482d4b88aa482dfea7f7549470902049a050020a, but I can't find it!

comes from receive-pack that runs on the other repo (i.e. the one with incomplete tags you just removed), so it means send-pack decided it does not need to send that object -- meaning the other end claimed it already has it. What to send and what need not to be sent is determined solely based on what send-pack hears from receive-pack in the initial handshake, which is in receive-pack.c::write_head_info(). It scans everything under ".git/refs" directory (not just .git/refs/heads or .git/refs/tags; if you had ".git/refs/FOOBAR", it will cause the remote end to claim it has everything reachable from it -- the only exceptions are things that starts with a dot '.', which is probably why cg-fetch places a temporary heads in refs/*/.$name-fetching) and sends them -- it does not look at the object directory and magically claim it has something that is not recorded in its .git/refs/ directory.

Previous: Martin LanghoffNext: Martin Langhoff
Message 4 of 5 in “cg-clone, tag objects and cg-push/git-push don't play nice”
  1. Martin LanghoffOct 19, 2005
  2. Junio C HamanoOct 19, 2005
  3. Martin LanghoffOct 19, 2005
  4. Junio C HamanoOct 19, 2005
  5. Martin LanghoffOct 19, 2005

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.