English ▾ Themen ▾ Neueste Version ▾ git-pack-objects zuletzt aktualisiert in 2.52.0

NAME

git-pack-objects - Erstellt ein gepacktes Archiv von Objekten

SYNOPSIS

git pack-objects [-q | --progress | --all-progress] [--all-progress-implied]
		   [--no-reuse-delta] [--delta-base-offset] [--non-empty]
		   [--local] [--incremental] [--window=<n>] [--depth=<n>]
		   [--revs [--unpacked | --all]] [--keep-pack=<pack-name>]
		   [--cruft] [--cruft-expiration=<time>]
		   [--stdout [--filter=<filter-spec>] | <base-name>]
		   [--shallow] [--keep-true-parents] [--[no-]sparse]
		   [--name-hash-version=<n>] [--path-walk] < <object-list>

BESCHREIBUNG

Liest eine Liste von Objekten von der Standardeingabe und schreibt entweder ein oder mehrere gepackte Archive mit dem angegebenen Basisnamen auf die Festplatte oder ein gepacktes Archiv auf die Standardausgabe.

Ein gepacktes Archiv ist eine effiziente Methode, um eine Menge von Objekten zwischen zwei Repositories zu übertragen, sowie ein zugriffseffizientes Archivierungsformat. In einem gepackten Archiv wird ein Objekt entweder als komprimiertes Ganzes oder als Differenz zu einem anderen Objekt gespeichert. Letzteres wird oft als Delta bezeichnet.

Das Format für gepackte Archive (.pack) ist so konzipiert, dass es eigenständig ist und ohne weitere Informationen entpackt werden kann. Daher muss jedes Objekt, von dem ein Delta abhängt, im Pack vorhanden sein.

Eine Pack-Indexdatei (.idx) wird für schnellen, zufälligen Zugriff auf die Objekte im Pack generiert. Wenn sowohl die Indexdatei (.idx) als auch das gepackte Archiv (.pack) im Unterverzeichnis pack/ von $GIT_OBJECT_DIRECTORY (oder einem der Verzeichnisse in $GIT_ALTERNATE_OBJECT_DIRECTORIES) platziert werden, kann Git aus dem gepackten Archiv lesen.

Der Befehl git unpack-objects kann das gepackte Archiv lesen und die im Pack enthaltenen Objekte in das "one-file one-object"-Format entpacken. Dies wird typischerweise von den Smart-Pull-Befehlen durchgeführt, wenn ein Pack für den effizienten Netzwerktransport von ihren Peers "on-the-fly" erstellt wird.

OPTIONEN

basis-name

Schreibt in Paare von Dateien (.pack und .idx), wobei <basis-name> zur Bestimmung des Namens der erstellten Datei verwendet wird. Wenn diese Option verwendet wird, werden die beiden Dateien in einem Paar in den Dateien <basis-name>-<SHA-1>.{pack,idx} geschrieben. <SHA-1> ist ein Hash, der auf dem Pack-Inhalt basiert und auf die Standardausgabe des Befehls geschrieben wird.

--stdout

Schreibt den Inhalt des Packs (was in die .pack-Datei geschrieben worden wäre) auf die Standardausgabe.

--revs

Liest die Revisionsargumente von der Standardeingabe anstelle einzelner Objekt-IDs. Die Revisionsargumente werden genauso verarbeitet, wie git rev-list mit dem Flag --objects seine commit-Argumente verwendet, um die Liste der von ihm ausgegebenen Objekte zu erstellen. Die Objekte auf der resultierenden Liste werden gepackt. Neben Revisions, werden auch --not oder --shallow <SHA-1>-Zeilen akzeptiert.

--unpacked

Dies impliziert --revs. Beim Verarbeiten der von der Standardeingabe gelesenen Liste von Revisionsargumenten werden nur die Objekte gepackt, die noch nicht gepackt sind.

--all

Dies impliziert --revs. Zusätzlich zur Liste der von der Standardeingabe gelesenen Revisionsargumente wird so getan, als ob alle Refs unter refs/ zur Aufnahme angegeben wären.

--include-tag

Schließt nicht angeforderte annotierte Tags ein, wenn das von ihnen referenzierte Objekt im resultierenden Packfile enthalten war. Dies kann nützlich sein, um neue Tags an native Git-Clients zu senden.

--stdin-packs[=<mode>]

Liest die Basisnamen von Packfiles (z.B. pack-1234abcd.pack) von der Standardeingabe anstelle von Objekt-IDs oder Revisionsargumenten. Das resultierende Pack enthält alle Objekte, die in den enthaltenen Packs aufgeführt sind (die nicht mit ^ beginnen), und schließt alle Objekte aus, die in den ausgeschlossenen Packs aufgeführt sind (die mit ^ beginnen).

Wenn mode "follow" ist, werden Objekte aus Packs, die nicht auf stdin aufgelistet sind, speziell behandelt. Objekte in nicht aufgelisteten Packs werden einbezogen, wenn diese Objekte (1) von den enthaltenen Packs erreichbar sind und (2) in keinem ausgeschlossenen Pack gefunden werden. Dieser Modus ist nützlich, um beispielsweise einmal nicht erreichbare Objekte aus Cruft-Packs wiederherzustellen, um Packs zu generieren, die unter Erreichbarkeit bis zur Grenze des ausgeschlossenen Packs geschlossen sind.

Inkompatibel mit --revs oder Optionen, die --revs implizieren (wie z.B. --all), mit Ausnahme von --unpacked, das kompatibel ist.

--cruft

Packt nicht erreichbare Objekte in ein separates "Cruft"-Pack, das durch die Existenz einer Datei .mtimes gekennzeichnet ist. Wird typischerweise von git repack --cruft verwendet. Aufrufer stellen eine Liste von Pack-Namen bereit und geben an, welche Packs im Repository verbleiben und welche gelöscht werden (angezeigt durch das Präfix -). Der Inhalt des Cruft-Packs sind alle Objekte, die nicht in den überlebenden Packs enthalten sind, die nicht die Gnadenfrist überschritten haben (siehe --cruft-expiration unten), oder die die Gnadenfrist überschritten haben, aber von einem anderen Objekt erreichbar sind, das dies nicht hat.

Wenn die Eingabe ein Pack enthält, das alle erreichbaren Objekte enthält (und alle anderen Packs als ausstehend zum Löschen auflistet), enthält das entsprechende Cruft-Pack alle nicht erreichbaren Objekte (mit mtime neuer als --cruft-expiration) sowie alle nicht erreichbaren Objekte, deren mtime älter als --cruft-expiration ist, aber von einem nicht erreichbaren Objekt erreichbar sind, dessen mtime neuer als --cruft-expiration ist.

Inkompatibel mit --unpack-unreachable, --keep-unreachable, --pack-loose-unreachable, --stdin-packs sowie allen anderen Optionen, die --revs implizieren.

--cruft-expiration=<approxidate>

Wenn angegeben, werden Objekte aus dem Cruft-Pack eliminiert, wenn sie eine mtime haben, die älter ist als <approxidate>. Wenn nicht angegeben (und --cruft gegeben ist), werden keine Objekte eliminiert.

--window=<n>
--depth=<n>

Diese beiden Optionen beeinflussen, wie die im Pack enthaltenen Objekte mit Delta-Kompression gespeichert werden. Die Objekte werden zuerst intern nach Typ, Größe und optional nach Namen sortiert und mit den anderen Objekten innerhalb von --window verglichen, um zu sehen, ob die Verwendung von Delta-Kompression Platz spart. --depth begrenzt die maximale Delta-Tiefe. Wenn sie zu tief eingestellt wird, beeinträchtigt dies die Leistung auf der Entpackerseite, da Delta-Daten so oft angewendet werden müssen, um zum benötigten Objekt zu gelangen.

Der Standardwert für --window ist 10 und für --depth ist 50. Die maximale Tiefe beträgt 4095.

--window-memory=<n>

Diese Option bietet eine zusätzliche Grenze über --window hinaus; die Fenstergröße wird dynamisch reduziert, sodass sie nicht mehr als <n> Bytes im Speicher belegt. Dies ist nützlich in Repositories mit einer Mischung aus großen und kleinen Objekten, um nicht mit einem großen Fenster den Speicher zu erschöpfen, aber dennoch die Vorteile eines großen Fensters für die kleineren Objekte nutzen zu können. Die Größe kann mit "k", "m" oder "g" suffigiert werden. --window-memory=0 macht die Speichernutzung unbegrenzt. Der Standardwert wird aus der Konfigurationsvariable pack.windowMemory übernommen.

--max-pack-size=<n>

In ungewöhnlichen Szenarien können Sie möglicherweise keine Dateien erstellen, die größer als eine bestimmte Größe auf Ihrem Dateisystem sind. Diese Option kann verwendet werden, um dem Befehl mitzuteilen, die Ausgabepackdatei in mehrere unabhängige Packdateien aufzuteilen, die jeweils nicht größer als die angegebene Größe sind. Die Größe kann mit "k", "m" oder "g" suffigiert werden. Die minimal zulässige Größe ist auf 1 MiB begrenzt. Der Standardwert ist unbegrenzt, es sei denn, die Konfigurationsvariable pack.packSizeLimit ist gesetzt. Beachten Sie, dass diese Option zu einem größeren und langsameren Repository führen kann; siehe die Diskussion in pack.packSizeLimit.

--honor-pack-keep

Dieses Flag bewirkt, dass ein Objekt, das sich bereits in einem lokalen Pack befindet und eine .keep-Datei hat, ignoriert wird, auch wenn es ansonsten gepackt worden wäre.

--keep-pack=<pack-name>

Dieses Flag bewirkt, dass ein Objekt, das sich bereits in dem angegebenen Pack befindet, ignoriert wird, auch wenn es ansonsten gepackt worden wäre. <pack-name> ist der Packdateiname ohne führendes Verzeichnis (z.B. pack-123.pack). Die Option kann mehrfach angegeben werden, um mehrere Packs zu behalten.

--incremental

Dieses Flag bewirkt, dass ein Objekt, das sich bereits in einem Pack befindet, ignoriert wird, auch wenn es ansonsten gepackt worden wäre.

--local

Dieses Flag bewirkt, dass ein Objekt, das aus einem alternativen Objektspeicher geliehen wurde, ignoriert wird, auch wenn es ansonsten gepackt worden wäre.

--non-empty

Erstellt nur dann ein gepacktes Archiv, wenn es mindestens ein Objekt enthält.

--progress

Der Fortschrittsstatus wird standardmäßig auf dem Standardfehlerausgabestrom berichtet, wenn dieser an ein Terminal angeschlossen ist, es sei denn, -q wird angegeben. Diese Flag erzwingt die Anzeige des Fortschrittsstatus, auch wenn der Standardfehlerausgabestrom nicht an ein Terminal weitergeleitet wird.

--all-progress

Wenn --stdout angegeben ist, wird während der Objektzählung und der Komprimierungsphasen ein Fortschrittsbericht angezeigt, aber während der Ausgabephase unterdrückt. Der Grund dafür ist, dass in einigen Fällen der Ausgabestrom direkt mit einem anderen Befehl verknüpft ist, der möglicherweise einen eigenen Fortschrittsstatus anzeigen möchte, während er eingehende Packdaten verarbeitet. Dieses Flag ist wie --progress, außer dass es auch für die Ausgabephase einen Fortschrittsbericht erzwingt, auch wenn --stdout verwendet wird.

--all-progress-implied

Dies wird verwendet, um --all-progress zu implizieren, wann immer die Fortschrittsanzeige aktiviert ist. Im Gegensatz zu --all-progress erzwingt dieses Flag selbst keine Fortschrittsanzeige.

-q

Dieses Flag sorgt dafür, dass der Befehl seinen Fortschritt nicht auf dem Standardfehlerstrom meldet.

--no-reuse-delta

Beim Erstellen eines gepackten Archivs in einem Repository mit vorhandenen Packs wiederverwendet der Befehl bestehende Deltas. Dies führt manchmal zu einem etwas suboptimalen Pack. Dieses Flag weist den Befehl an, bestehende Deltas nicht wiederzuverwenden, sondern sie von Grund auf neu zu berechnen.

--no-reuse-object

Dieses Flag weist den Befehl an, vorhandene Objektdaten überhaupt nicht wiederzuverwenden, einschließlich nicht-deltifizierter Objekte, und zwingt zur Neuberechnung von allem. Dies impliziert --no-reuse-delta. Nur im obskuren Fall nützlich, wenn eine vollständige Durchsetzung eines anderen Kompressionsgrads auf den gepackten Daten gewünscht wird.

--compression=<n>

Gibt die Komprimierungsstufe für neu komprimierte Daten im generierten Pack an. Wenn nicht angegeben, wird die Komprimierungsstufe des Packs zuerst durch pack.compression, dann durch core.compression bestimmt und standardmäßig auf -1 (die zlib-Standardeinstellung) gesetzt, wenn keines davon gesetzt ist. Fügen Sie --no-reuse-object hinzu, wenn Sie eine einheitliche Komprimierungsstufe für alle Daten erzwingen möchten, unabhängig von der Quelle.

--sparse
--no-sparse

Schaltet den "sparse"-Algorithmus zur Bestimmung der im Pack zu enthaltenen Objekte um, wenn er mit der Option "--revs" kombiniert wird. Dieser Algorithmus durchläuft nur Bäume, die in Pfaden vorkommen, die neue Objekte einführen. Dies kann erhebliche Leistungsvorteile bringen, wenn ein Pack zur Übermittlung einer kleinen Änderung berechnet wird. Es ist jedoch möglich, dass zusätzliche Objekte in die Packdatei aufgenommen werden, wenn die enthaltenen Commits bestimmte Arten von direkten Umbenennungen enthalten. Wenn diese Option nicht enthalten ist, wird standardmäßig der Wert von pack.useSparse verwendet, der true ist, sofern nicht anders angegeben.

--thin

Erstellt ein "dünnes" Pack, indem gemeinsame Objekte zwischen einem Sender und einem Empfänger weggelassen werden, um die Netzwerkübertragung zu reduzieren. Diese Option ist nur in Verbindung mit --stdout sinnvoll.

Hinweis: Ein dünnes Pack verletzt das Format für gepackte Archive, indem erforderliche Objekte weggelassen werden, und ist daher für Git unbrauchbar, ohne es eigenständig zu machen. Verwenden Sie git index-pack --fix-thin (siehe git-index-pack[1]), um die eigenständige Eigenschaft wiederherzustellen.

--shallow

Optimiert ein Pack, das einem Client mit einem flachen Repository bereitgestellt werden soll. Diese Option kann in Kombination mit --thin zu einem kleineren Pack führen, jedoch auf Kosten der Geschwindigkeit.

--delta-base-offset

Ein gepacktes Archiv kann das Basisobjekt eines Deltas entweder als 20-Byte-Objekt-ID oder als Offset im Stream ausdrücken, aber alte Git-Versionen verstehen letzteres nicht. Standardmäßig verwendet git pack-objects nur das erstere Format für bessere Kompatibilität. Diese Option ermöglicht es dem Befehl, das letztere Format für Kompaktheit zu verwenden. Abhängig von der durchschnittlichen Delta-Kettenlänge schrumpft diese Option typischerweise die resultierende Packdatei um 3-5 Prozent.

Hinweis: Porcelain-Befehle wie git gc (siehe git-gc[1]), git repack (siehe git-repack[1]) übergeben diese Option standardmäßig in modernen Git-Versionen, wenn sie Objekte in Ihren Repository in Packdateien ablegen. Ebenso tut dies git bundle (siehe git-bundle[1]), wenn es ein Bundle erstellt.

--threads=<n>

Gibt die Anzahl der Threads an, die beim Suchen nach den besten Delta-Übereinstimmungen erzeugt werden sollen. Dies erfordert, dass pack-objects mit pthreads kompiliert wurde, andernfalls wird diese Option mit einer Warnung ignoriert. Dies soll die Packzeit auf Mehrprozessormaschinen reduzieren. Der benötigte Speicher für das Delta-Suchfenster wird jedoch mit der Anzahl der Threads multipliziert. Die Angabe von 0 bewirkt, dass Git die Anzahl der CPUs automatisch erkennt und die Anzahl der Threads entsprechend einstellt.

--index-version=<version>[,<offset>]

Dies ist nur für die Testsuite vorgesehen. Es ermöglicht das Erzwingen der Version für den generierten Pack-Index und das Erzwingen von 64-Bit-Indexeinträgen für Objekte oberhalb des angegebenen Offsets.

--keep-true-parents

Mit dieser Option werden Elternobjekte, die durch Grafting verborgen sind, trotzdem gepackt.

--filter=<filter-spec>

Lässt bestimmte Objekte (normalerweise Blobs) aus der resultierenden Packdatei weg. Siehe git-rev-list[1] für gültige <filter-spec>-Formen.

--no-filter

Deaktiviert jedes vorherige --filter=-Argument.

--missing=<missing-action>

Eine Debugging-Option zur Unterstützung der zukünftigen Entwicklung von "partial clone". Diese Option gibt an, wie fehlende Objekte behandelt werden.

Die Form --missing=error verlangt, dass pack-objects mit einem Fehler stoppt, wenn ein fehlendes Objekt angetroffen wird. Wenn das Repository ein partieller Klon ist, wird vor der Deklaration als fehlend ein Versuch unternommen, fehlende Objekte abzurufen. Dies ist die Standardaktion.

Die Form --missing=allow-any erlaubt, dass die Objekt-Durchquerung fortgesetzt wird, wenn ein fehlendes Objekt angetroffen wird. Es wird kein Abruf eines fehlenden Objekts stattfinden. Fehlende Objekte werden stillschweigend aus den Ergebnissen ausgeschlossen.

Die Form --missing=allow-promisor ist wie allow-any, erlaubt aber nur, dass die Objekt-Durchquerung für ERWARTETE Promisor-fehlende Objekte fortgesetzt wird. Es wird kein Abruf eines fehlenden Objekts stattfinden. Ein unerwartetes fehlendes Objekt löst einen Fehler aus.

--exclude-promisor-objects

Schließt Objekte aus, von denen bekannt ist, dass sie sich im Promisor-Remote befinden. (Diese Option dient nur dazu, auf lokal erstellte Objekte zu operieren, damit wir bei einem Repack weiterhin zwischen lokal erstellten Objekten [ohne .promisor] und Objekten vom Promisor-Remote [mit .promisor] unterscheiden können.) Dies wird bei partiellen Klonen verwendet.

--keep-unreachable

Objekte, die von den Refs in den mit --unpacked= angegebenen Packs nicht erreichbar sind, werden zusätzlich zu den erreichbaren Objekten, die sich nicht in mit *.keep-Dateien markierten Packs befinden, zum resultierenden Pack hinzugefügt. Dies impliziert --revs.

--pack-loose-unreachable

Packt nicht erreichbare lose Objekte (und entfernt ihre losen Gegenstücke). Dies impliziert --revs.

--unpack-unreachable

Behält nicht erreichbare Objekte in loser Form. Dies impliziert --revs.

--delta-islands

Beschränkt Delta-Übereinstimmungen basierend auf "Inseln". Siehe DELTA ISLANDS unten.

--name-hash-version=<n>

Bei der Delta-Kompression gruppiert Git Objekte, die ähnlich sein könnten, basierend auf Heuristiken, die den Pfad zu diesem Objekt verwenden. Während die Gruppierung von Objekten nach einer exakten Pfadübereinstimmung für Pfade mit vielen Versionen gut ist, gibt es Vorteile bei der Suche nach Delta-Paaren über verschiedene vollständige Pfade hinweg. Git sammelt Objekte nach Typ und dann nach einem "Namen-Hash" des Pfades und dann nach Größe, in der Hoffnung, Objekte zu gruppieren, die gut zusammen komprimieren.

Die Standard-Namen-Hash-Version ist 1, die die Hash-Lokalität priorisiert, indem die letzten Bytes des Pfades als maximaler Betrag für die Hash-Funktion betrachtet werden. Diese Version eignet sich hervorragend zur Unterscheidung kurzer Pfade und zum Finden von Umbenennungen zwischen Verzeichnissen. Die Hash-Funktion hängt jedoch hauptsächlich von den letzten 16 Bytes des Pfades ab. Wenn es viele Pfade im Repository gibt, die dieselben letzten 16 Bytes haben und sich nur durch das übergeordnete Verzeichnis unterscheiden, kann dieser Namens-Hash zu vielen Kollisionen führen und schlechte Ergebnisse erzielen. Derzeit ist diese Version erforderlich, wenn Erreichbarkeits-Bitmap-Dateien mit --write-bitmap-index geschrieben werden.

Die Namen-Hash-Version 2 hat ähnliche Lokalitätsmerkmale wie Version 1, mit dem Unterschied, dass sie jede Pfadkomponente einzeln betrachtet und die Hashes mit einer Verschiebung überlagert. Dies priorisiert immer noch die letzten Bytes des Pfades, "salzt" aber auch die niedrigeren Bits des Hashes unter Verwendung der Namen der übergeordneten Verzeichnisse. Diese Methode bietet einige der Lokalitätsvorteile von Version 1 und bricht gleichzeitig die meisten Kollisionen von ähnlich benannten Dateien, die in vielen verschiedenen Verzeichnissen vorkommen. Derzeit ist diese Version nicht erlaubt, wenn Erreichbarkeits-Bitmap-Dateien mit --write-bitmap-index geschrieben werden, und sie wird automatisch auf Version 1 geändert.

--path-walk

Führt die Komprimierung durch, indem zuerst Objekte nach Pfad organisiert werden, gefolgt von einem zweiten Durchgang, der wie gewohnt über Pfade hinweg komprimiert. Dies hat das Potenzial, die Delta-Kompression zu verbessern, insbesondere bei Dateinamen, die Kollisionen im standardmäßigen Namens-Hash-Algorithmus von Git verursachen.

Inkompatibel mit --delta-islands, --shallow oder --filter. Die Option --use-bitmap-index wird in Anwesenheit von --path-walk ignoriert.

DELTA ISLANDS

Wenn möglich, versucht pack-objects, vorhandene Deltas auf der Festplatte wiederzuverwenden, um zu vermeiden, dass neue Deltas "on-the-fly" gesucht werden müssen. Dies ist eine wichtige Optimierung für die Bereitstellung von Fetches, da es bedeutet, dass der Server die meisten Objekte gar nicht aufblähen muss und die Bytes direkt von der Festplatte senden kann. Diese Optimierung funktioniert nicht, wenn ein Objekt als Delta gegen eine Basis gespeichert ist, die der Empfänger nicht hat (und die wir nicht bereits senden). In diesem Fall "bricht" der Server das Delta und muss ein neues finden, was einen hohen CPU-Aufwand verursacht. Daher ist es für die Leistung wichtig, dass die Menge der Objekte in Delta-Beziehungen auf der Festplatte mit dem übereinstimmt, was ein Client abrufen würde.

In einem normalen Repository funktioniert dies tendenziell automatisch. Die Objekte sind größtenteils von den Branches und Tags erreichbar, und das ist es, was Clients abrufen. Alle Deltas, die wir auf dem Server finden, sind wahrscheinlich zwischen Objekten, die der Client hat oder haben wird.

Aber in einigen Repository-Setups haben Sie möglicherweise mehrere verwandte, aber getrennte Gruppen von Ref-Spitzen, und Clients rufen diese Gruppen unabhängig voneinander ab. Stellen Sie sich zum Beispiel vor, Sie hosten mehrere "Forks" eines Repositorys in einem einzigen gemeinsamen Objektspeicher und lassen Clients diese über GIT_NAMESPACE oder separate Repositories über den Alternates-Mechanismus als separate Repositories anzeigen. Ein naiver Repack kann feststellen, dass das optimale Delta für ein Objekt gegen eine Basis ist, die nur in einem anderen Fork gefunden wird. Aber wenn ein Client abruft, hat er das Basisobjekt nicht, und wir müssen "on-the-fly" ein neues Delta finden.

Eine ähnliche Situation kann bestehen, wenn Sie viele Refs außerhalb von refs/heads/ und refs/tags/ haben, die auf verwandte Objekte verweisen (z.B. refs/pull oder refs/changes, die von einigen Hosting-Anbietern verwendet werden). Standardmäßig rufen Clients nur Heads und Tags ab, und Deltas gegen Objekte, die nur in diesen anderen Gruppen gefunden werden, können nicht ohne Weiteres gesendet werden.

Delta Islands lösen dieses Problem, indem sie es Ihnen ermöglichen, Ihre Refs in verschiedene "Inseln" zu gruppieren. Pack-objects berechnet, welche Objekte von welchen Inseln erreichbar sind, und weigert sich, ein Delta von einem Objekt A gegen eine Basis zu erstellen, die nicht in allen Inseln von A vorhanden ist. Dies führt zu etwas größeren Packs (da wir einige Delta-Möglichkeiten verpassen), garantiert aber, dass ein Fetch einer Insel keine Deltas "on-the-fly" neu berechnen muss, weil Inselgrenzen überschritten werden.

Beim Repacken mit Delta-Inseln tendiert das Delta-Fenster dazu, mit Kandidaten verstopft zu werden, die durch die Konfiguration verboten sind. Das Repacken mit einem großen --window hilft (und dauert nicht so lange, wie es sonst dauern könnte, da wir einige Objektpaare basierend auf Inseln ablehnen können, bevor wir überhaupt Berechnungen am Inhalt durchführen).

Inseln werden über die Option pack.island konfiguriert, die mehrmals angegeben werden kann. Jeder Wert ist ein links-verankertes reguläres Ausdruck, das Ref-Namen abgleicht. Zum Beispiel

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

platziert Heads und Tags in einer Insel (deren Name die leere Zeichenkette ist; siehe unten für mehr über Benennung). Alle Refs, die diesen regulären Ausdrücken nicht entsprechen (z.B. refs/pull/123), sind in keiner Insel. Alle Objekte, die nur von refs/pull/ (aber nicht von Heads oder Tags) erreichbar sind, sind daher kein Kandidat, der als Basis für refs/heads/ verwendet werden kann.

Refs werden basierend auf ihren "Namen" in Inseln gruppiert, und zwei Regexes, die denselben Namen erzeugen, gelten als in derselben Insel. Die Namen werden aus den Regexes berechnet, indem alle Erfassungsgruppen aus dem Regex verkettet werden, mit einem - Bindestrich dazwischen. (Und wenn keine Erfassungsgruppen vorhanden sind, dann ist der Name die leere Zeichenkette, wie im obigen Beispiel.) Dies ermöglicht es Ihnen, eine beliebige Anzahl von Inseln zu erstellen. Unterstützt werden jedoch nur bis zu 14 solcher Erfassungsgruppen.

Stellen Sie sich zum Beispiel vor, Sie speichern die Refs für jeden Fork in refs/virtual/ID, wobei ID eine numerische Kennung ist. Sie könnten dann konfigurieren

[pack]
island = refs/virtual/([0-9]+)/heads/
island = refs/virtual/([0-9]+)/tags/
island = refs/virtual/([0-9]+)/(pull)/

Das platziert die Heads und Tags für jeden Fork in ihrer eigenen Insel (benannt "1234" oder ähnlich), und die Pull-Refs für jeden in ihre eigene "1234-pull".

Beachten Sie, dass wir für jeden Regex eine einzelne Insel auswählen, indem wir die Reihenfolge "last one wins" verwenden (was es ermöglicht, dass repositoriespezifische Konfiguration Vorrang vor benutzereinheitlicher Konfiguration usw. hat).

KONFIGURATION

Verschiedene Konfigurationsvariablen beeinflussen das Packen, siehe git-config[1] (suchen Sie nach "pack" und "delta").

Insbesondere wird die Delta-Kompression nicht auf Objekten verwendet, die größer sind als die Konfigurationsvariable core.bigFileThreshold, und auf Dateien mit dem Attribut delta auf false gesetzt.

GIT

Teil der git[1] Suite