* [PATCH 0/4] send-pack: introduce a `no-ref-delta` capability
@ 2026-07-13 1:11 Taylor Blau
2026-07-13 1:14 ` Taylor Blau
2026-07-14 7:45 ` Jeff King
0 siblings, 2 replies; 3+ messages in thread
From: Taylor Blau @ 2026-07-13 1:11 UTC (permalink / raw)
To: git, git; +Cc: Jeff King, Junio C Hamano
This series teaches 'send-pack' to avoid writing `REF_DELTA` entries
when the receiving end asks it to.
Some 'receive-pack' implementations may wish to retain the incoming pack
without first building an object ID index, in which case requiring delta
bases to appear earlier in the same pack makes them easier to locate.
The new `no-ref-delta` capability is deliberately independent of
`ofs-delta`, and thus asking the sender not to write `REF_DELTA` entries
does not by itself mean that the receiver understands `OFS_DELTA`
entries. The corresponding `pack-objects` option therefore controls
`REF_DELTA` without changing whether `OFS_DELTA` is allowed.
The main complication is reuse. Ordinary delta reuse reuses the
compressed delta instructions, but rewrites the entry header and base
reference. It can therefore write an existing `REF_DELTA` as an
`OFS_DELTA` when `--delta-base-offset` is in effect and the base has
already been written in the output pack. Deltas against preferred or
external thin-pack bases cannot be reused in this way, since those bases
do not appear in the output at all.
Bitmap pack reuse is different, since it copies entries directly from
an existing pack. Under `--no-ref-delta`, it must inspect candidate
objects individually, omit `REF_DELTA` entries from direct pack reuse,
and leave them to the normal object-writing path.
The patches are organized as follows:
- The first patch teaches 'test-tool pack-deltas' to list each delta's
representation and base. I originally wrote the series without this,
but found that writing tests demonstrating which specific *kind* of
delta representation was chosen to be awkward without having a
dedicated test helper.
- The second patch introduces the `--no-ref-delta` option in
'pack-objects', though initially with delta- and bitmap-reuse
disabled for the sake of simplicity.
- The third patch re-enables ordinary delta- and bitmap-reuse where it
is safe to do so.
- The final patch advertises and consumes the new `no-ref-delta`
capability.
Thanks in advance for your review!
Taylor Blau (4):
t/helper: teach pack-deltas to list delta entries
pack-objects: introduce `--no-ref-delta`
pack-objects: support reuse with `--no-ref-delta`
send-pack: honor `no-ref-delta` capability
Documentation/git-pack-objects.adoc | 8 ++-
Documentation/gitprotocol-capabilities.adoc | 17 ++++-
builtin/pack-objects.c | 29 ++++++--
builtin/receive-pack.c | 5 ++
pack-bitmap.c | 30 +++++---
pack-bitmap.h | 3 +-
send-pack.c | 4 ++
send-pack.h | 1 +
t/helper/test-pack-deltas.c | 69 ++++++++++++++++++
t/t5300-pack-object.sh | 79 ++++++++++++++++++++-
t/t5332-multi-pack-reuse.sh | 16 +++++
t/t5516-fetch-push.sh | 14 ++++
12 files changed, 252 insertions(+), 23 deletions(-)
--
2.55.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 0/4] send-pack: introduce a `no-ref-delta` capability
2026-07-13 1:11 [PATCH 0/4] send-pack: introduce a `no-ref-delta` capability Taylor Blau
@ 2026-07-13 1:14 ` Taylor Blau
2026-07-14 7:45 ` Jeff King
1 sibling, 0 replies; 3+ messages in thread
From: Taylor Blau @ 2026-07-13 1:14 UTC (permalink / raw)
To: git; +Cc: Jeff King, Junio C Hamano
On Sun, Jul 12, 2026 at 06:11:47PM -0700, Taylor Blau wrote:
> This series teaches 'send-pack' to avoid writing `REF_DELTA` entries
> when the receiving end asks it to.
Hmmph. ISTM that my scripts for sending patches to the list somehow
broke the Message-ID of the cover letter, so the patches themselves are
not properly connected to this thread.
I'll investigate why that is separately, but in the meantime, the actual
patches may be found beginning here:
https://lore.kernel.org/git/alQ7WKITYDXfiVn9@com-79390/T/#meaec3602fcf2e3c6d05f7248239c1b167a1e6ddf
Thanks,
Taylor
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 0/4] send-pack: introduce a `no-ref-delta` capability
2026-07-13 1:11 [PATCH 0/4] send-pack: introduce a `no-ref-delta` capability Taylor Blau
2026-07-13 1:14 ` Taylor Blau
@ 2026-07-14 7:45 ` Jeff King
1 sibling, 0 replies; 3+ messages in thread
From: Jeff King @ 2026-07-14 7:45 UTC (permalink / raw)
To: Taylor Blau; +Cc: git, Junio C Hamano
On Sun, Jul 12, 2026 at 06:11:47PM -0700, Taylor Blau wrote:
> Some 'receive-pack' implementations may wish to retain the incoming pack
> without first building an object ID index, in which case requiring delta
> bases to appear earlier in the same pack makes them easier to locate.
This explanation puzzles me. OK, I can see why you might want to take in
the incoming pack and then sit on it for a bit. But surely you are not
going to update refs without seeing what's in the pack, right? Otherwise
any pushing client can corrupt your repo.
And the only way to know what's in the pack is to index it. At which
point resolving REF_DELTAs is the least of your worries there.
So I have the feeling that there's some ulterior motive, or that this is
part of a larger system, but I don't quite understand what it is. And so
it's hard to say whether this is a sensible approach.
> Bitmap pack reuse is different, since it copies entries directly from
> an existing pack. Under `--no-ref-delta`, it must inspect candidate
> objects individually, omit `REF_DELTA` entries from direct pack reuse,
> and leave them to the normal object-writing path.
Hmm. We wouldn't normally expect verbatim pack-reuse to kick in, since
this is about the client sending to the server. But OK, we certainly
need to make sure that path remains correct.
> - The final patch advertises and consumes the new `no-ref-delta`
> capability.
What about thin packs? They'll result in REF_DELTAs on the server once
the pack is completed/indexed. I guess we have the "no-thin" capability,
but I don't think our receive-pack implementation support sending it. I
also wouldn't be terribly surprised if not every client implementation
supports it (it was added in 2013 I think to support libgit2). But I
guess that is also true of your new no-ref-delta; only updated clients
will respect it.
What will/should a server do when they get a ref delta anyway? That
again goes back to the question of: why don't we want ref deltas?
-Peff
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-07-14 7:45 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-13 1:11 [PATCH 0/4] send-pack: introduce a `no-ref-delta` capability Taylor Blau
2026-07-13 1:14 ` Taylor Blau
2026-07-14 7:45 ` Jeff King
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox