Home Explore Blog CI



git

7th chunk of `Documentation/git-pack-objects.adoc`
60b633534f56b2605d98aca8d23d46a8c63a28a311bd9e1f00000001000007e0
 between objects
the client has or will have.

But in some repository setups, you may have several related but separate
groups of ref tips, with clients tending to fetch those groups
independently. For example, imagine that you are hosting several "forks"
of a repository in a single shared object store, and letting clients
view them as separate repositories through `GIT_NAMESPACE` or separate
repos using the alternates mechanism. A naive repack may find that the
optimal delta for an object is against a base that is only found in
another fork. But when a client fetches, they will not have the base
object, and we'll have to find a new delta on the fly.

A similar situation may exist if you have many refs outside of
`refs/heads/` and `refs/tags/` that point to related objects (e.g.,
`refs/pull` or `refs/changes` used by some hosting providers). By
default, clients fetch only heads and tags, and deltas against objects
found only in those other groups cannot be sent as-is.

Delta islands solve this problem by allowing you to group your refs into
distinct "islands". Pack-objects computes which objects are reachable
from which islands, and refuses to make a delta from an object `A`
against a base which is not present in all of `A`'s islands. This
results in slightly larger packs (because we miss some delta
opportunities), but guarantees that a fetch of one island will not have
to recompute deltas on the fly due to crossing island boundaries.

When repacking with delta islands the delta window tends to get
clogged with candidates that are forbidden by the config. Repacking
with a big --window helps (and doesn't take as long as it otherwise
might because we can reject some object pairs based on islands before
doing any computation on the content).

Islands are configured via the `pack.island` option, which can be
specified multiple times. Each value is a left-anchored regular
expressions matching refnames. For example:

-------------------------------------------
[pack]
island = refs/heads/

Title: Git Delta Islands Configuration
Summary
Delta islands in Git solve the problem of finding optimal deltas between objects in separate groups of ref tips, by grouping refs into distinct islands and refusing to make deltas against bases not present in all of an object's islands, resulting in slightly larger packs but guaranteeing efficient fetches, and can be configured using the `pack.island` option with left-anchored regular expressions matching refnames.