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

Re: Shallow clone

From
Junio C Hamano <junkio@cox.net>
Date
Nov 13, 2006, 05:29 UTC
Message-ID
<7vodrbap94.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<7vd57scong.fsf@assigned-by-dhcp.cox.net>
Junio C Hamano <junkio@cox.net> writes:
Show 26 quoted lines
> Sergey Vlasov <vsu@altlinux.ru> writes:
>
>> This is due to optimization in builtin-pack-objects.c:try_delta():
>>
>> 	/*
>> 	 * We do not bother to try a delta that we discarded
>> 	 * on an earlier try, but only when reusing delta data.
>> 	 */
>> 	if (!no_reuse_delta && trg_entry->in_pack &&
>> 	    trg_entry->in_pack == src_entry->in_pack)
>> 		return 0;
>>
>> After removing this part the shallow pack after clone is 2.6M, as it
>> should be.
>>
>> The problem with this optimization is that it is only valid if we are
>> repacking either the same set of objects as we did earlier, or its
>> superset.  But if we are packing a subset of objects, there will be some
>> objects in that subset which were delta-compressed in the original pack,
>> but base objects for that deltas are not included in our subset -
>> therefore we will be unable to reuse existing deltas, and with that
>> optimization we will never try to use delta compression for these
>> objects.
>> ...
>> So any partial fetch (shallow or not) from a mostly packed repository
>> currently results in a suboptimal pack.

What we tried to avoid with the original heuristics in commit 51d1e83f was to avoid wasting time on undeltifiable blobs, and they would be stored as base in the original packs, so I think the following would fly better (the patch is for maint, for master we would also check for OBJ_REF_DELTA as well).

---
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
index 96c069a..84a8749 100644
--- a/builtin-pack-objects.c
+++ b/builtin-pack-objects.c
@@ -1101,7 +1101,8 @@ static int try_delta(struct unpacked *tr
 	 * on an earlier try, but only when reusing delta data.
 	 */
 	if (!no_reuse_delta && trg_entry->in_pack &&
-	    trg_entry->in_pack == src_entry->in_pack)
+	    trg_entry->in_pack == src_entry->in_pack &&
+	    trg_entry->in_pack_type != OBJ_DELTA)
 		return 0;
 
 	/*
Previous: Junio C HamanoNext: Petr Baudis
Message 11 of 20 in “What's in git.git”
  1. Junio C HamanoNov 8, 2006
  2. David LangNov 8, 2006
  3. Shallow clone [Was Re: What's in git.git ]Aneesh Kumar K.V, Nov 8, 2006
  4. Aneesh Kumar K.VNov 8, 2006
  5. Junio C HamanoNov 9, 2006
  6. Aneesh KumarNov 9, 2006
  7. Alexandre JulliardNov 11, 2006
  8. Junio C HamanoNov 12, 2006
  9. Sergey VlasovNov 12, 2006
  10. Junio C HamanoNov 12, 2006
  11. Junio C HamanoNov 13, 2006
  12. Petr BaudisNov 12, 2006
  13. Junio C HamanoNov 12, 2006
  14. Johannes SchindelinNov 12, 2006
  15. Jakub NarebskiNov 8, 2006
  16. Junio C HamanoNov 8, 2006
  17. Jakub NarebskiNov 8, 2006
  18. Junio C HamanoNov 8, 2006
  19. Petr BaudisNov 8, 2006
  20. Junio C HamanoNov 9, 2006

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.