English ▾ Themen ▾ Neueste Version ▾ git-fast-import zuletzt aktualisiert in 2.52.0

NAME

git-fast-import - Backend für schnelle Git-Datenimporte

SYNOPSIS

frontend | git fast-import [<options>]

BESCHREIBUNG

Dieses Programm ist normalerweise nicht das, was der Endbenutzer direkt ausführen möchte. Die meisten Endbenutzer möchten eines der vorhandenen Frontend-Programme verwenden, das einen bestimmten Typ von Fremdquelle analysiert und die dort gespeicherten Inhalte an git fast-import weitergibt.

fast-import liest einen gemischten Befehls-/Datenstrom von Standardeingabe und schreibt einen oder mehrere Packfiles direkt in das aktuelle Repository. Wenn EOF auf der Standardeingabe empfangen wird, schreibt fast-import aktualisierte Branch- und Tag-Refs, wodurch das aktuelle Repository vollständig mit den neu importierten Daten aktualisiert wird.

Das fast-import-Backend selbst kann in ein leeres Repository importieren (ein, das bereits von git init initialisiert wurde) oder ein vorhandenes, gefülltes Repository inkrementell aktualisieren. Ob inkrementelle Importe von einer bestimmten Fremdquelle unterstützt werden, hängt vom verwendeten Frontend-Programm ab.

OPTIONEN

--force

Erzwingt die Aktualisierung von geänderten vorhandenen Branches, auch wenn dadurch Commits verloren gehen (da der neue Commit den alten Commit nicht enthält).

--quiet

Deaktiviert die Ausgabe von --stats, wodurch fast-import bei Erfolg normalerweise still ist. Wenn der Importstrom jedoch Direktiven enthält, die zur Anzeige von Benutzerausgaben bestimmt sind (z. B. progress-Direktiven), werden die entsprechenden Meldungen weiterhin angezeigt.

--stats

Zeigt einige grundlegende Statistiken über die von fast-import erstellten Objekte, die Packfiles, in denen sie gespeichert wurden, und den von fast-import während dieses Laufs verwendeten Speicher an. Die Anzeige dieser Ausgabe ist derzeit Standard, kann aber mit --quiet deaktiviert werden.

--allow-unsafe-features

Viele Kommandozeilenoptionen können als Teil des fast-import-Streams selbst bereitgestellt werden, indem die Befehle feature oder option verwendet werden. Einige dieser Optionen sind jedoch unsicher (z. B. erlauben sie fast-import den Zugriff auf das Dateisystem außerhalb des Repositories). Diese Optionen sind standardmäßig deaktiviert, können aber durch Bereitstellung dieser Option in der Befehlszeile aktiviert werden. Dies betrifft derzeit nur die Befehle export-marks, import-marks und import-marks-if-exists.

Aktivieren Sie diese Option nur, wenn Sie dem Programm, das den fast-import-Stream generiert, vertrauen! Diese Option wird automatisch für Remote-Helper aktiviert, die die import-Funktion verwenden, da sie bereits vertrauenswürdig sind, ihren eigenen Code auszuführen.

--signed-tags=(verbatim|warn-verbatim|warn-strip|strip|abort)

Gibt an, wie signierte Tags behandelt werden sollen. Verhält sich genauso wie die gleiche Option in git-fast-export[1], außer dass der Standardwert verbatim ist (anstelle von abort).

--signed-commits=(verbatim|warn-verbatim|warn-strip|strip|abort)

Gibt an, wie signierte Commits behandelt werden sollen. Verhält sich genauso wie die gleiche Option in git-fast-export[1], außer dass der Standardwert verbatim ist (anstelle von abort).

Optionen für Frontends

--cat-blob-fd=<fd>

Schreibt Antworten auf Abfragen vom Typ get-mark, cat-blob und ls auf den Dateideskriptor <fd> anstelle von stdout. Ermöglicht die Trennung von progress-Ausgaben, die für den Endbenutzer bestimmt sind, von anderen Ausgaben.

--date-format=<fmt>

Gibt den Datumsformat-Typ an, den das Frontend in den Befehlen author, committer und tagger an fast-import liefert. Siehe „Datumsformate“ unten für Details zu unterstützten Formaten und deren Syntax.

--done

Beendet mit einem Fehler, wenn am Ende des Streams kein done-Befehl vorhanden ist. Diese Option kann nützlich sein, um Fehler zu erkennen, die dazu führen, dass das Frontend beendet wird, bevor es mit dem Schreiben eines Streams begonnen hat.

Speicherorte von Marks-Dateien

--export-marks=<datei>

Gibt die interne Marks-Tabelle nach Abschluss in <datei> aus. Marks werden eine pro Zeile als :markid SHA-1 geschrieben. Frontends können diese Datei verwenden, um Importe nach deren Abschluss zu validieren oder um die Marks-Tabelle über inkrementelle Läufe hinweg zu speichern. Da <datei> nur beim Checkpoint (oder Abschluss) geöffnet und geleert wird, kann derselbe Pfad auch sicher an --import-marks übergeben werden.

--import-marks=<datei>

Lädt die in <datei> angegebenen Marks, bevor eine Eingabe verarbeitet wird. Die Eingabedatei muss existieren, lesbar sein und das gleiche Format verwenden, das von --export-marks erzeugt wird. Es können mehrere Optionen angegeben werden, um mehr als eine Reihe von Marks zu importieren. Wenn ein Mark anders definiert ist, gewinnt die letzte Datei.

--import-marks-if-exists=<datei>

Wie --import-marks, aber anstatt einen Fehler auszugeben, wird die Datei stillschweigend übersprungen, wenn sie nicht existiert.

--relative-marks
--no-relative-marks

Nach der Angabe von --relative-marks sind die mit --import-marks= und --export-marks= angegebenen Pfade relativ zu einem internen Verzeichnis im aktuellen Repository. In git-fast-import bedeutet dies, dass die Pfade relativ zum Verzeichnis .git/info/fast-import sind. Andere Importer können jedoch einen anderen Speicherort verwenden.

Relative und nicht-relative Marks können durch Verschachtelung von --(no-)-relative-marks mit den --(import|export)-marks= Optionen kombiniert werden.

Submodul-Umschreibung

--rewrite-submodules-from=<name>:<datei>
--rewrite-submodules-to=<name>:<datei>

Schreibt die Objekt-IDs für das durch <name> angegebene Submodul von den in der from <datei> verwendeten Werten auf die in der to <datei> verwendeten Werte um. Die from-Marks sollten von git fast-export erstellt worden sein, und die to-Marks sollten von git fast-import beim Import desselben Submoduls erstellt worden sein.

<name> kann eine beliebige Zeichenfolge sein, die kein Doppelpunktzeichen enthält, aber derselbe Wert muss mit beiden Optionen verwendet werden, wenn entsprechende Marks angegeben werden. Mehrere Submodule können mit unterschiedlichen Werten für <name> angegeben werden. Es ist ein Fehler, diese Optionen nicht in entsprechenden Paaren zu verwenden.

Diese Optionen sind hauptsächlich nützlich, wenn ein Repository von einem Hash-Algorithmus zu einem anderen konvertiert wird; ohne sie schlägt fast-import fehl, wenn es ein Submodul antrifft, da es keine Möglichkeit hat, die Objekt-ID in den neuen Hash-Algorithmus zu schreiben.

Leistungs- und Komprimierungsoptimierung

--active-branches=<n>

Maximale Anzahl von gleichzeitig aktiven Branches. Siehe „Speicherauslastung“ unten für Details. Standard ist 5.

--big-file-threshold=<n>

Maximale Größe eines Blobs, für den fast-import versuchen wird, ein Delta zu erstellen, ausgedrückt in Bytes. Der Standardwert ist 512 MB (512 MiB). Einige Importer möchten dies möglicherweise auf Systemen mit begrenztem Speicher verringern.

--depth=<n>

Maximale Delta-Tiefe für die Delta-Deltifizierung von Blobs und Bäumen. Standard ist 50.

--export-pack-edges=<datei>

Nachdem ein Packfile erstellt wurde, wird eine Datenzeile in <datei> gedruckt, die den Dateinamen des Packfiles und den letzten Commit auf jedem Branch auflistet, der in dieses Packfile geschrieben wurde. Diese Informationen können nach dem Import von Projekten nützlich sein, deren gesamte Objektmenge das 4 GiB Packfile-Limit überschreitet, da diese Commits als Kantenpunkte bei Aufrufen von git pack-objects verwendet werden können.

--max-pack-size=<n>

Maximale Größe jedes Ausgabe-Packfiles. Der Standardwert ist unbegrenzt.

fastimport.unpackLimit

Siehe git-config[1]

LEISTUNG

Das Design von fast-import ermöglicht es, große Projekte mit minimalem Speicherverbrauch und geringer Verarbeitungszeit zu importieren. Vorausgesetzt, das Frontend kann mit fast-import Schritt halten und ihm einen konstanten Datenstrom zuführen, werden Importzeiten für Projekte mit mehr als 10 Jahren Geschichte und über 100.000 einzelnen Commits im Allgemeinen in nur 1-2 Stunden auf recht bescheidener Hardware (ca. 2.000 USD im Jahr 2007) abgeschlossen.

Die meisten Engpässe scheinen im Zugriff auf fremde Quelldaten (die Quelle kann Revisionen einfach nicht schnell genug extrahieren) oder in der Festplatten-I/O zu liegen (fast-import schreibt so schnell, wie die Festplatte die Daten aufnehmen kann). Importe laufen schneller, wenn die Quelldaten auf einem anderen Laufwerk als das Ziel-Git-Repository gespeichert sind (aufgrund geringerer I/O-Konflikte).

ENTWICKLUNGSKOSTEN

Ein typisches Frontend für fast-import umfasst etwa 200 Zeilen Perl/Python/Ruby-Code. Die meisten Entwickler konnten funktionierende Importer in nur wenigen Stunden erstellen, selbst wenn dies ihre erste Begegnung mit fast-import und manchmal sogar mit Git war. Dies ist eine ideale Situation, da die meisten Konvertierungstools Wegwerfartikel sind (einmal verwenden und nie wieder zurückblicken).

PARALLELER BETRIEB

Wie git push oder git fetch können Importe, die von fast-import behandelt werden, sicher neben parallelen Aufrufen von git repack -a -d oder git gc oder anderen Git-Operationen (einschließlich git prune, da lose Objekte von fast-import nie verwendet werden) ausgeführt werden.

fast-import sperrt die Branch- oder Tag-Refs, die es gerade importiert, nicht. Nach dem Import testet fast-import während seiner Ref-Update-Phase jede vorhandene Branch-Ref, um zu überprüfen, ob das Update ein Fast-Forward-Update sein wird (der in der Ref gespeicherte Commit ist im neuen Verlauf des zu schreibenden Commits enthalten). Wenn das Update kein Fast-Forward-Update ist, überspringt fast-import die Aktualisierung dieser Ref und gibt stattdessen eine Warnmeldung aus. fast-import versucht immer, alle Branch-Refs zu aktualisieren und stoppt nicht beim ersten Fehler.

Branch-Aktualisierungen können mit --force erzwungen werden, aber es wird empfohlen, dies nur in einem ansonsten ruhigen Repository zu verwenden. Die Verwendung von --force ist für einen anfänglichen Import in ein leeres Repository nicht notwendig.

TECHNISCHE DISKUSSION

fast-import verwaltet eine Reihe von Branches im Speicher. Jeder Branch kann jederzeit während des Importprozesses erstellt oder geändert werden, indem ein commit-Befehl im Eingabestrom gesendet wird. Dieses Design ermöglicht es einem Frontend-Programm, eine unbegrenzte Anzahl von Branches gleichzeitig zu verarbeiten und Commits in der Reihenfolge zu generieren, in der sie aus den Quelldaten verfügbar sind. Es vereinfacht auch die Frontend-Programme erheblich.

fast-import verwendet oder verändert nicht das aktuelle Arbeitsverzeichnis oder Dateien darin. (Es aktualisiert jedoch das aktuelle Git-Repository, wie durch GIT_DIR referenziert.) Daher kann ein Import-Frontend das Arbeitsverzeichnis für eigene Zwecke nutzen, z. B. zur Extraktion von Dateirevisionen aus der Fremdquelle. Diese Ignoranz des Arbeitsverzeichnisses ermöglicht es fast-import auch, sehr schnell zu laufen, da es keine kostspieligen Dateiaktualisierungsoperationen durchführen muss, wenn zwischen Branches gewechselt wird.

EINGABEFORMAT

Mit Ausnahme von rohen Dateidaten (die Git nicht interpretiert) ist das fast-import-Eingabeformat textbasiert (ASCII). Dieses textbasierte Format vereinfacht die Entwicklung und das Debugging von Frontend-Programmen, insbesondere wenn eine höhere Sprache wie Perl, Python oder Ruby verwendet wird.

fast-import ist bei seiner Eingabe sehr streng. Wo wir unten SP sagen, meinen wir **genau** ein Leerzeichen. Ebenso bedeutet LF einen (und nur einen) Zeilenumbruch und HT einen (und nur einen) horizontalen Tabulator. Zusätzliche Leerzeichen führen zu unerwarteten Ergebnissen, wie z. B. Branch- oder Dateinamen mit führenden oder nachgestellten Leerzeichen oder eine vorzeitige Beendigung von fast-import, wenn es unerwartete Eingaben erhält.

Stream-Kommentare

Zur Unterstützung des Debuggings von Frontends ignoriert fast-import jede Zeile, die mit # (ASCII-Pfad/Hash) beginnt, bis einschließlich des Zeilenendes LF. Eine Kommentarzeile kann jede Byte-Sequenz enthalten, die kein LF enthält, und kann daher verwendet werden, um detaillierte Debugging-Informationen einzuschließen, die für das Frontend spezifisch und bei der Inspektion eines fast-import-Datenstroms nützlich sein können.

Datumsformate

Die folgenden Datumsformate werden unterstützt. Ein Frontend sollte das zu verwendende Format für diesen Import auswählen, indem es den Formatnamen über die Kommandozeilenoption --date-format=<fmt> übergibt.

raw

Dies ist das native Git-Format und lautet <time> SP <offutc>. Es ist auch das Standardformat von fast-import, wenn --date-format nicht angegeben wurde.

Die Zeit des Ereignisses wird durch <time> als Anzahl der Sekunden seit dem UNIX-Epoch (Mitternacht, 1. Januar 1970, UTC) angegeben und als ASCII-Dezimalzahl geschrieben.

Der lokale Offset wird durch <offutc> als positiver oder negativer Offset von UTC angegeben. Zum Beispiel würde EST (das 5 Stunden hinter UTC liegt) in <tz> durch „-0500“ ausgedrückt, während UTC „+0000“ ist. Der lokale Offset beeinflusst <time> nicht; er dient nur als Hinweis, um Formatierungsroutinen bei der Anzeige des Zeitstempels zu helfen.

Wenn der lokale Offset im Quellmaterial nicht verfügbar ist, verwenden Sie „+0000“ oder den gängigsten lokalen Offset. Beispielsweise haben viele Organisationen ein CVS-Repository, das nur von Benutzern in derselben Region und Zeitzone aufgerufen wurde. In diesem Fall könnte ein angemessener Offset von UTC angenommen werden.

Im Gegensatz zum rfc2822-Format ist dieses Format sehr streng. Jede Formatierungsabweichung führt dazu, dass fast-import den Wert ablehnt, und einige Überprüfungen der numerischen Werte können ebenfalls durchgeführt werden.

raw-permissive

Dies ist dasselbe wie raw, mit der Ausnahme, dass keine Überprüfungen des numerischen Epochs und des lokalen Offsets durchgeführt werden. Dies kann nützlich sein, wenn Sie eine bestehende Historie mit z. B. ungültigen Zeitzonenwerten filtern oder importieren.

rfc2822

Dies ist das Standard-Datumsformat, wie es in RFC 2822 beschrieben wird.

Ein Beispielwert ist „Tue Feb 6 11:22:18 2007 -0500“. Der Git-Parser ist genau, aber etwas nachgiebig. Es ist derselbe Parser, der von git am beim Anwenden von Patches aus E-Mails verwendet wird.

Einige fehlerhafte Zeichenfolgen können als gültige Daten akzeptiert werden. In einigen dieser Fälle kann Git das korrekte Datum aus der fehlerhaften Zeichenfolge ermitteln. Es gibt auch einige Arten von fehlerhaften Zeichenfolgen, die Git falsch parst und trotzdem für gültig hält. Stark fehlerhafte Zeichenfolgen werden abgelehnt.

Im Gegensatz zum obigen raw-Format wird die Zeitzonen-/UTC-Offset-Information in einer RFC 2822-Datumszeichenfolge verwendet, um den Datumswert vor der Speicherung an UTC anzupassen. Daher ist es wichtig, dass diese Informationen so genau wie möglich sind.

Wenn das Quellmaterial RFC 2822-Stil-Daten verwendet, sollte das Frontend fast-import die Analyse und Konvertierung überlassen (anstatt zu versuchen, sie selbst durchzuführen), da der Git-Parser in der Praxis gut getestet wurde.

Frontends sollten das raw-Format bevorzugen, wenn das Quellmaterial bereits das UNIX-Epoch-Format verwendet, dazu gebracht werden kann, Daten in diesem Format zu liefern, oder sein Format leicht in dieses konvertiert werden kann, da beim Parsen keine Mehrdeutigkeit besteht.

now

Verwendet immer die aktuelle Zeit und Zeitzone. Das Literal now muss immer für <when> angegeben werden.

Dies ist ein Spielformat. Die aktuelle Zeit und Zeitzone dieses Systems wird immer in die Identitätszeichenfolge kopiert, wenn sie von fast-import erstellt wird. Es gibt keine Möglichkeit, eine andere Zeit oder Zeitzone anzugeben.

Dieses spezielle Format wird bereitgestellt, da es kurz zu implementieren ist und für einen Prozess nützlich sein kann, der sofort einen neuen Commit erstellen möchte, ohne ein Arbeitsverzeichnis oder git update-index verwenden zu müssen.

Wenn separate author- und committer-Befehle in einem commit verwendet werden, stimmen die Zeitstempel möglicherweise nicht überein, da die Systemuhr zweimal abgefragt wird (einmal für jeden Befehl). Die einzige Möglichkeit, sicherzustellen, dass sowohl Autor- als auch Committer-Identitätsinformationen denselben Zeitstempel haben, besteht darin, author wegzulassen (und somit vom committer zu kopieren) oder ein anderes Datumsformat als now zu verwenden.

Befehle

fast-import akzeptiert mehrere Befehle, um das aktuelle Repository zu aktualisieren und den aktuellen Importprozess zu steuern. Eine detailliertere Diskussion (mit Beispielen) zu jedem Befehl folgt später.

commit

Erstellt einen neuen Branch oder aktualisiert einen vorhandenen Branch, indem ein neuer Commit erstellt und der Branch so aktualisiert wird, dass er auf den neu erstellten Commit zeigt.

tag

Erstellt ein signiertes Tag-Objekt aus einem vorhandenen Commit oder Branch. Leichtgewichtige Tags werden von diesem Befehl nicht unterstützt, da sie nicht zur Aufzeichnung aussagekräftiger Zeitpunkte empfohlen werden.

reset

Setzt einen vorhandenen Branch (oder einen neuen Branch) auf eine bestimmte Revision zurück. Dieser Befehl muss verwendet werden, um einen Branch auf eine bestimmte Revision zu ändern, ohne einen Commit darauf zu machen.

blob

Konvertiert rohe Dateidaten in einen Blob zur späteren Verwendung in einem commit-Befehl. Dieser Befehl ist optional und wird für einen Import nicht benötigt.

alias

Aufzeichnen, dass eine Markierung auf ein gegebenes Objekt verweist, ohne zuerst ein neues Objekt zu erstellen. Die Verwendung von --import-marks und die Bezugnahme auf fehlende Marks führt dazu, dass fast-import fehlschlägt. Aliase können daher eine Möglichkeit bieten, anderweitig abgeschnittene Commits auf einen gültigen Wert zu setzen (z. B. den nächsten nicht abgeschnittenen Vorfahren).

checkpoint

Erzwingt, dass fast-import das aktuelle Packfile schließt, seine eindeutige SHA-1-Prüfsumme und seinen Index generiert und ein neues Packfile startet. Dieser Befehl ist optional und wird für einen Import nicht benötigt.

progress

Bewirkt, dass fast-import die gesamte Zeile auf seine eigene Standardausgabe ausgibt. Dieser Befehl ist optional und wird für einen Import nicht benötigt.

done

Markiert das Ende des Streams. Dieser Befehl ist optional, es sei denn, die done-Funktion wurde über die Kommandozeilenoption --done oder den Befehl feature done angefordert.

get-mark

Bewirkt, dass fast-import die SHA-1-Entsprechung für eine Markierung auf den mit --cat-blob-fd festgelegten Dateideskriptor oder auf stdout, falls nicht angegeben, ausgibt.

cat-blob

Bewirkt, dass fast-import einen Blob im cat-file --batch-Format auf den mit --cat-blob-fd festgelegten Dateideskriptor oder auf stdout, falls nicht angegeben, ausgibt.

ls

Bewirkt, dass fast-import eine Zeile beschreibt, die einen Verzeichniseintrag im ls-tree-Format auf den mit --cat-blob-fd festgelegten Dateideskriptor oder auf stdout, falls nicht angegeben, ausgibt.

feature

Aktiviert die angegebene Funktion. Dies erfordert, dass fast-import die angegebene Funktion unterstützt, und bricht ab, wenn dies nicht der Fall ist.

option

Gibt eine der unter OPTIONEN aufgeführten Optionen an, die die Stream-Semantik nicht ändern, um den Bedürfnissen des Frontends gerecht zu werden. Dieser Befehl ist optional und wird für einen Import nicht benötigt.

commit

Erstellt oder aktualisiert einen Branch mit einem neuen Commit, der eine logische Änderung am Projekt aufzeichnet.

	'commit' SP <ref> LF
	mark?
	original-oid?
	('author' (SP <name>)? SP LT <email> GT SP <when> LF)?
	'committer' (SP <name>)? SP LT <email> GT SP <when> LF
	('gpgsig' SP <algo> SP <format> LF data)?
	('encoding' SP <encoding> LF)?
	data
	('from' SP <commit-ish> LF)?
	('merge' SP <commit-ish> LF)*
	(filemodify | filedelete | filecopy | filerename | filedeleteall | notemodify)*
	LF?

wobei <ref> der Name des Branches ist, auf dem der Commit erstellt werden soll. Typischerweise sind Branch-Namen in Git mit refs/heads/ präfixiert, daher würde der Import des CVS-Branch-Symbols RELENG-1_0 refs/heads/RELENG-1_0 für den Wert von <ref> verwenden. Der Wert von <ref> muss ein gültiger Git-Refname sein. Da LF in einem Git-Refnamen nicht gültig ist, wird hier keine Anführungs- oder Escape-Syntax unterstützt.

Ein mark-Befehl kann optional erscheinen und fordert fast-import auf, eine Referenz auf den neu erstellten Commit für die zukünftige Verwendung durch das Frontend zu speichern (siehe unten für das Format). Es ist sehr üblich, dass Frontends jeden erstellten Commit markieren, wodurch zukünftige Branch-Erstellungen von jedem importierten Commit ermöglicht werden.

Der data-Befehl nach committer muss die Commit-Nachricht bereitstellen (siehe unten für die Syntax des data-Befehls). Um eine leere Commit-Nachricht zu importieren, verwenden Sie eine Datenlänge von 0. Commit-Nachrichten sind frei formatiert und werden von Git nicht interpretiert. Derzeit müssen sie in UTF-8 kodiert sein, da fast-import keine anderen Kodierungen zulässt.

Null oder mehr filemodify, filedelete, filecopy, filerename, filedeleteall und notemodify Befehle können enthalten sein, um den Inhalt des Branches vor der Erstellung des Commits zu aktualisieren. Diese Befehle können in beliebiger Reihenfolge angegeben werden. Es wird jedoch empfohlen, einen filedeleteall-Befehl allen filemodify-, filecopy-, filerename- und notemodify-Befehlen im selben Commit voranzustellen, da filedeleteall den Branch löscht (siehe unten).

Das LF nach dem Befehl ist optional (es war früher erforderlich). Beachten Sie, dass aus Gründen der Abwärtskompatibilität, wenn der Commit mit einem data-Befehl endet (d. h. er hat keine from-, merge-, filemodify-, filedelete-, filecopy-, filerename-, filedeleteall- oder notemodify-Befehle), dann zwei LF-Befehle am Ende des Befehls anstelle von nur einem erscheinen können.

author

Ein author-Befehl kann optional erscheinen, wenn die Autoreninformation von der Committer-Information abweichen kann. Wenn author weggelassen wird, verwendet fast-import automatisch die Committer-Informationen für den Autorenteil des Commits. Siehe unten für eine Beschreibung der Felder in author, da diese identisch mit committer sind.

committer

Der committer-Befehl gibt an, wer diesen Commit gemacht hat und wann er ihn gemacht hat.

Hier ist <name> der Anzeigename der Person (z. B. „Com M Itter“) und <email> die E-Mail-Adresse der Person („cm@example.com“). LT und GT sind die literalen Kleiner-als (\x3c) und Größer-als (\x3e) Symbole. Diese sind erforderlich, um die E-Mail-Adresse von den anderen Feldern in der Zeile abzugrenzen. Beachten Sie, dass <name> und <email> frei formatiert sind und jede Byte-Sequenz enthalten können, außer LT, GT und LF. <name> ist typischerweise UTF-8-kodiert.

Die Zeit der Änderung wird durch <when> unter Verwendung des Datumsformats angegeben, das über die Kommandozeilenoption --date-format=<fmt> ausgewählt wurde. Siehe „Datumsformate“ oben für die Liste der unterstützten Formate und deren Syntax.

gpgsig

Der optionale Befehl gpgsig wird verwendet, um eine PGP/GPG-Signatur oder eine andere kryptografische Signatur einzuschließen, die die Commit-Daten signiert.

	'gpgsig' SP <git-hash-algo> SP <signature-format> LF data

Der Befehl gpgsig nimmt zwei Argumente entgegen

  • <git-hash-algo> gibt an, auf welches Git-Objektformat diese Signatur angewendet wird, entweder sha1 oder sha256. Dies ermöglicht es, zu wissen, welche Darstellung des Commits signiert wurde (die SHA-1- oder die SHA-256-Version), was sowohl bei der Signaturverifizierung als auch bei der Interoperabilität zwischen Repositories mit unterschiedlichen Hash-Funktionen hilft.

  • <signature-format> gibt den Signaturtyp an, z. B. openpgp, x509, ssh oder unknown. Dies ist eine Erleichterung für Tools, die den Stream verarbeiten, sodass sie die ASCII-Rüstung nicht parsen müssen, um den Signaturtyp zu identifizieren.

Ein Commit kann höchstens eine Signatur für das SHA-1-Objektformat (gespeichert im „gpgsig“-Header) und eine für das SHA-256-Objektformat (gespeichert im „gpgsig-sha256“-Header) haben.

Siehe unten für eine detaillierte Beschreibung des data-Befehls, der die rohen Signaturdaten enthält.

Signaturen werden in der aktuellen Implementierung noch nicht überprüft. (Das Setzen der Konfigurationsoption extensions.compatObjectFormat könnte bereits helfen, sowohl SHA-1- als auch SHA-256-Objektformat-Signaturen zu überprüfen, wenn sie implementiert sind.)

Hinweis
Dies ist höchst experimentell und das Format des gpgsig-Befehls kann sich in Zukunft ohne Kompatibilitätsgarantien ändern.

encoding

Der optionale Befehl encoding gibt die Kodierung der Commit-Nachricht an. Die meisten Commits sind UTF-8 und die Kodierung wird weggelassen, aber dies ermöglicht den Import von Commit-Nachrichten in Git, ohne sie vorher neu zu kodieren.

from

Der Befehl from wird verwendet, um den Commit anzugeben, von dem dieser Branch initialisiert werden soll. Diese Revision wird der erste Vorfahre des neuen Commits sein. Der Zustand des Baumes, der in diesem Commit aufgebaut wird, beginnt mit dem Zustand des from-Commits und wird durch die Inhaltsänderungen in diesem Commit verändert.

Das Weglassen des from-Befehls im ersten Commit eines neuen Branches führt dazu, dass fast-import diesen Commit ohne Vorfahren erstellt. Dies ist normalerweise nur für den ersten Commit eines Projekts wünschenswert. Wenn das Frontend beim Erstellen eines neuen Branches alle Dateien von Grund auf neu erstellt, kann anstelle von from ein merge-Befehl verwendet werden, um den Commit mit einem leeren Baum zu beginnen. Das Weglassen des from-Befehls bei vorhandenen Branches ist normalerweise erwünscht, da der aktuelle Commit auf diesem Branch automatisch als erster Vorfahre des neuen Commits angenommen wird.

Da LF in einem Git-Refnamen oder SHA-1-Ausdruck nicht gültig ist, wird keine Anführungs- oder Escape-Syntax innerhalb von <commit-ish> unterstützt.

Hier ist <commit-ish> eines der Folgenden

  • Der Name eines vorhandenen Branches, der sich bereits in fast-imports interner Branch-Tabelle befindet. Wenn fast-import den Namen nicht kennt, wird er als SHA-1-Ausdruck behandelt.

  • Eine Markierungsreferenz, :<idnum>, wobei <idnum> die Markierungsnummer ist.

    Der Grund, warum fast-import : verwendet, um eine Markierungsreferenz zu bezeichnen, ist, dass dieses Zeichen in einem Git-Branch-Namen ungültig ist. Das führende : erleichtert die Unterscheidung zwischen der Markierung 42 (:42) und dem Branch 42 (42 oder refs/heads/42) oder einer abgekürzten SHA-1, die zufällig nur aus Dezimalziffern bestand.

    Marks müssen deklariert werden (mittels mark), bevor sie verwendet werden können.

  • Eine vollständige 40-Byte oder abgekürzte Commit-SHA-1 in Hexadezimal.

  • Jeder gültige Git-SHA-1-Ausdruck, der zu einem Commit aufgelöst wird. Siehe „REVISIONEN SPEZIFIZIEREN“ in gitrevisions[7] für Details.

  • Die spezielle Null-SHA-1 (40 Nullen) gibt an, dass der Branch entfernt werden soll.

Der Spezialfall des Neustarts eines inkrementellen Imports vom aktuellen Branch-Wert sollte geschrieben werden als

	from refs/heads/branch^0

Das Suffix ^0 ist notwendig, da fast-import es nicht zulässt, dass ein Branch von sich selbst aus gestartet wird, und der Branch im Speicher erstellt wird, bevor der from-Befehl überhaupt aus der Eingabe gelesen wird. Das Hinzufügen von ^0 zwingt fast-import dazu, den Commit über die Git-Revisionen-Parsing-Bibliothek aufzulösen und nicht über seine interne Branch-Tabelle, wodurch der vorhandene Wert des Branches geladen wird.

merge

Enthält einen zusätzlichen Vorgänger-Commit. Der zusätzliche Ahnen-Link ändert nicht die Art und Weise, wie der Baumzustand bei diesem Commit aufgebaut wird. Wenn der from-Befehl beim Erstellen eines neuen Branches weggelassen wird, ist der erste merge-Commit der erste Vorgänger des aktuellen Commits, und der Branch startet ohne Dateien. Eine unbegrenzte Anzahl von merge-Befehlen pro Commit ist durch fast-import erlaubt, wodurch ein n-Wege-Merge etabliert wird.

Hier ist <commit-ish> ein beliebiger der Commit-Spezifikationsausdrücke, die auch von from akzeptiert werden (siehe oben).

filemodify

Ist in einem commit-Befehl enthalten, um eine neue Datei hinzuzufügen oder den Inhalt einer vorhandenen Datei zu ändern. Dieser Befehl hat zwei verschiedene Möglichkeiten, den Inhalt der Datei anzugeben.

Externes Datenformat

Der Dateninhalt für die Datei wurde bereits durch einen vorherigen blob-Befehl geliefert. Das Frontend muss ihn nur noch verbinden.

	'M' SP <mode> SP <dataref> SP <path> LF

Hier muss <dataref> normalerweise entweder eine Markierungsreferenz (:<idnum>) sein, die durch einen vorherigen blob-Befehl gesetzt wurde, oder eine vollständige 40-stellige SHA-1 eines vorhandenen Git-Blob-Objekts. Wenn <mode> 040000 ist, muss <dataref> die vollständige 40-stellige SHA-1 eines vorhandenen Git-Tree-Objekts oder eine Markierungsreferenz sein, die mit --import-marks gesetzt wurde.

Inline-Datenformat

Der Dateninhalt für die Datei wurde noch nicht geliefert. Das Frontend möchte ihn als Teil dieses Modify-Befehls liefern.

	'M' SP <mode> SP 'inline' SP <path> LF
	data

Siehe unten für eine detaillierte Beschreibung des data-Befehls.

In beiden Formaten ist <mode> der Dateityp, angegeben in Oktal. Git unterstützt nur die folgenden Modi

  • 100644 oder 644: Eine normale (nicht ausführbare) Datei. Die Mehrheit der Dateien in den meisten Projekten verwendet diesen Modus. Im Zweifelsfall ist dies der, den Sie wollen.

  • 100755 oder 755: Eine normale, aber ausführbare Datei.

  • 120000: Ein Symlink, der Inhalt der Datei wird das Linkziel sein.

  • 160000: Ein Gitlink, SHA-1 des Objekts verweist auf einen Commit in einem anderen Repository. Gitlinks können nur entweder per SHA oder über eine Commit-Markierung angegeben werden. Sie werden verwendet, um Submodule zu implementieren.

  • 040000: Ein Unterverzeichnis. Unterverzeichnisse können nur per SHA oder über eine Baummarkierung, die mit --import-marks gesetzt wurde, angegeben werden.

In beiden Formaten ist <path> der vollständige Pfad der hinzuzufügenden Datei (falls noch nicht vorhanden) oder zu ändernden Datei (falls bereits vorhanden).

Ein <path> kann als unquoted Bytes oder als C-style-Quoted-String geschrieben werden.

Wenn ein <path> nicht mit einem doppelten Anführungszeichen (") beginnt, ist es ein unquoted String und wird als Literalbytes ohne Escape-Sequenzen geparst. Wenn der Dateiname jedoch LF enthält oder mit einem doppelten Anführungszeichen beginnt, kann er nicht als unquoted String dargestellt werden und muss zitiert werden. Zusätzlich muss der Quellpfad <path> in filecopy oder filerename zitiert werden, wenn er SP enthält.

Wenn ein <path> mit einem doppelten Anführungszeichen (") beginnt, ist es ein C-style-Quoted-String, bei dem der vollständige Dateiname in einem Paar von doppelten Anführungszeichen eingeschlossen ist und Escape-Sequenzen verwendet werden. Bestimmte Zeichen müssen durch ein Backslash davor maskiert werden: LF wird als \n, Backslash als \\ und doppeltes Anführungszeichen als \" geschrieben. Einige Zeichen können optional mit Escape-Sequenzen geschrieben werden: \a für Glocke, \b für Rückschritt, \f für Seitenvorschub, \n für Zeilenvorschub, \r für Wagenrücklauf, \t für horizontalen Tabulator und \v für vertikalen Tabulator. Jedes Byte kann mit 3-stelligen Oktalzahlen (z. B. \033) geschrieben werden. Alle Dateinamen können als zitiert Strings dargestellt werden.

Ein <path> muss UNIX-Style-Verzeichnistrenner (Schrägstrich /) verwenden und sein Wert muss in kanonischer Form sein. Das heißt, er darf nicht

  • eine leere Verzeichnis-Komponente enthalten (z. B. ist foo//bar ungültig),

  • mit einem Verzeichnistrenner enden (z. B. ist foo/ ungültig),

  • mit einem Verzeichnistrenner beginnen (z. B. ist /foo ungültig),

  • die spezielle Komponente . oder .. enthalten (z. B. sind foo/./bar und foo/../bar ungültig).

Die Wurzel des Baumes kann durch einen leeren String als <path> dargestellt werden.

<path> darf kein NUL enthalten, weder wörtlich noch als \000 escaped. Es wird empfohlen, <path> immer in UTF-8 zu kodieren.

filedelete

Ist in einem commit-Befehl enthalten, um eine Datei zu entfernen oder ein ganzes Verzeichnis rekursiv aus dem Branch zu löschen. Wenn die Entfernung der Datei oder des Verzeichnisses sein Elternverzeichnis leer macht, wird das Elternverzeichnis automatisch ebenfalls entfernt. Dies kaskadiert den Baum hinauf, bis das erste nicht leere Verzeichnis oder die Wurzel erreicht ist.

	'D' SP <path> LF

Hier ist <path> der vollständige Pfad der aus dem Branch zu entfernenden Datei oder des Unterverzeichnisses. Siehe filemodify oben für eine detaillierte Beschreibung von <path>.

filecopy

Kopiert rekursiv eine vorhandene Datei oder ein vorhandenes Unterverzeichnis an einen anderen Ort innerhalb des Branches. Die vorhandene Datei oder das vorhandene Verzeichnis muss existieren. Wenn das Ziel existiert, wird es vollständig durch den Inhalt ersetzt, der von der Quelle kopiert wurde.

	'C' SP <path> SP <path> LF

Hier ist das erste <path> der Quellort und das zweite <path> das Ziel. Siehe filemodify oben für eine detaillierte Beschreibung, wie <path> aussehen kann. Um einen Quellpfad zu verwenden, der SP enthält, muss der Pfad zitiert werden.

Ein filecopy-Befehl wird sofort wirksam. Sobald der Quellort an das Ziel kopiert wurde, wirken sich zukünftige Befehle, die auf den Quellort angewendet werden, nicht auf das Ziel der Kopie aus.

filerename

Benennt eine vorhandene Datei oder ein vorhandenes Unterverzeichnis an einen anderen Ort innerhalb des Branches um. Die vorhandene Datei oder das vorhandene Verzeichnis muss existieren. Wenn das Ziel existiert, wird es durch das Quellverzeichnis ersetzt.

	'R' SP <path> SP <path> LF

Hier ist das erste <path> der Quellort und das zweite <path> das Ziel. Siehe filemodify oben für eine detaillierte Beschreibung, wie <path> aussehen kann. Um einen Quellpfad zu verwenden, der SP enthält, muss der Pfad zitiert werden.

Ein filerename-Befehl wird sofort wirksam. Sobald der Quellort in das Ziel umbenannt wurde, erstellen zukünftige Befehle, die auf den Quellort angewendet werden, neue Dateien dort und wirken sich nicht auf das Ziel der Umbenennung aus.

Beachten Sie, dass ein filerename dasselbe ist wie eine filecopy gefolgt von einer filedelete des Quellorts. Es gibt einen geringen Leistungsvorteil bei der Verwendung von filerename, aber der Vorteil ist so gering, dass es sich nie lohnt, zu versuchen, ein Delete/Add-Paar in Quellmaterial in einen Rename für fast-import umzuwandeln. Dieser filerename-Befehl wird nur zur Vereinfachung von Frontends bereitgestellt, die bereits Rename-Informationen haben und sich nicht darum kümmern wollen, diese in eine filecopy gefolgt von einer filedelete zu zerlegen.

filedeleteall

Ist in einem commit-Befehl enthalten, um alle Dateien (und auch alle Verzeichnisse) aus dem Branch zu entfernen. Dieser Befehl setzt die interne Branch-Struktur zurück, sodass keine Dateien mehr vorhanden sind, was es dem Frontend ermöglicht, anschließend alle interessanten Dateien von Grund auf neu hinzuzufügen.

	'deleteall' LF

Dieser Befehl ist äußerst nützlich, wenn das Frontend nicht weiß (oder sich nicht darum kümmern will), welche Dateien sich derzeit auf dem Branch befinden, und daher keine ordnungsgemäßen filedelete-Befehle generieren kann, um den Inhalt zu aktualisieren.

Die Ausgabe eines filedeleteall gefolgt von den erforderlichen filemodify-Befehlen zur Festlegung des korrekten Inhalts ergibt die gleichen Ergebnisse wie die Ausgabe nur der erforderlichen filemodify- und filedelete-Befehle. Der filedeleteall-Ansatz erfordert jedoch möglicherweise, dass fast-import pro aktivem Branch etwas mehr Speicher verbraucht (weniger als 1 MiB selbst für die meisten großen Projekte); daher werden Frontends, die nur die betroffenen Pfade für einen Commit leicht ermitteln können, dazu ermutigt.

notemodify

Ist in einem commit <notes-ref>-Befehl enthalten, um eine neue Notiz hinzuzufügen, die einen <commit-ish> annotiert, oder um den Inhalt dieser Annotation zu ändern. Intern ist es ähnlich wie filemodify 100644 auf <commit-ish> Pfad (vielleicht in Unterverzeichnisse aufgeteilt). Es wird nicht empfohlen, andere Befehle zum Schreiben in den <notes-ref>-Baum zu verwenden, außer filedeleteall, um alle vorhandenen Notizen in diesem Baum zu löschen. Dieser Befehl hat zwei verschiedene Möglichkeiten, den Inhalt der Notiz anzugeben.

Externes Datenformat

Der Dateninhalt für die Notiz wurde bereits durch einen vorherigen blob-Befehl geliefert. Das Frontend muss ihn nur noch mit dem zu annotierenden Commit verbinden.

	'N' SP <dataref> SP <commit-ish> LF

Hier kann <dataref> entweder eine Markierungsreferenz (:<idnum>) sein, die durch einen vorherigen blob-Befehl gesetzt wurde, oder eine vollständige 40-stellige SHA-1 eines vorhandenen Git-Blob-Objekts.

Inline-Datenformat

Der Dateninhalt für die Notiz wurde noch nicht geliefert. Das Frontend möchte ihn als Teil dieses Modify-Befehls liefern.

	'N' SP 'inline' SP <commit-ish> LF
	data

Siehe unten für eine detaillierte Beschreibung des data-Befehls.

In beiden Formaten ist <commit-ish> ein beliebiger der Commit-Spezifikationsausdrücke, die auch von from akzeptiert werden (siehe oben).

mark

Veranlasst fast-import, eine Referenz auf das aktuelle Objekt zu speichern, wodurch das Frontend dieses Objekt zu einem späteren Zeitpunkt abrufen kann, ohne seine SHA-1 zu kennen. Hier ist das aktuelle Objekt der Befehl zur Objekterstellung, in dem der mark-Befehl erscheint. Dies kann commit, tag und blob sein, aber commit ist die häufigste Verwendung.

	'mark' SP ':' <idnum> LF

wobei <idnum> die vom Frontend dieser Markierung zugewiesene Nummer ist. Der Wert von <idnum> wird als ASCII-Dezimalzahl ausgedrückt. Der Wert 0 ist reserviert und kann nicht als Markierung verwendet werden. Nur Werte größer oder gleich 1 dürfen als Markierungen verwendet werden.

Neue Markierungen werden automatisch erstellt. Vorhandene Markierungen können einfach durch Wiederverwendung desselben <idnum> in einem anderen mark-Befehl auf ein anderes Objekt verschoben werden.

original-oid

Gibt den Namen des Objekts im ursprünglichen Quellkontrollsystem an. fast-import wird diese Anweisung einfach ignorieren, aber Filterprozesse, die den Stream bearbeiten und modifizieren, bevor sie ihn an fast-import weiterleiten, könnten diese Informationen verwenden.

	'original-oid' SP <object-identifier> LF

wobei <object-identifier> eine beliebige Zeichenkette ohne LF ist.

tag

Erstellt einen annotierten Tag, der sich auf einen bestimmten Commit bezieht. Zum Erstellen von leichten (nicht-annotierten) Tags siehe den reset-Befehl unten.

	'tag' SP <name> LF
	mark?
	'from' SP <commit-ish> LF
	original-oid?
	'tagger' (SP <name>)? SP LT <email> GT SP <when> LF
	data

wobei <name> der Name des zu erstellenden Tags ist.

Tag-Namen werden in Git automatisch mit refs/tags/ präfixiert, daher würde der Import des CVS-Branch-Symbols RELENG-1_0-FINAL nur RELENG-1_0-FINAL für <name> verwenden, und fast-import schreibt den entsprechenden Ref als refs/tags/RELENG-1_0-FINAL.

Der Wert von <name> muss ein gültiger Git-Refname sein und kann daher Schrägstriche enthalten. Da LF in einem Git-Refnamen nicht gültig ist, wird hier keine Quoting- oder Escape-Syntax unterstützt.

Der from-Befehl ist derselbe wie im commit-Befehl; siehe oben für Details.

Der tagger-Befehl verwendet das gleiche Format wie committer innerhalb von commit; siehe wieder oben für Details.

Der data-Befehl, der auf tagger folgt, muss die annotierte Tag-Nachricht liefern (siehe unten für die Syntax des data-Befehls). Um eine leere Tag-Nachricht zu importieren, verwenden Sie Daten mit 0 Länge. Tag-Nachrichten sind frei formatiert und werden von Git nicht interpretiert. Derzeit müssen sie in UTF-8 kodiert sein, da fast-import keine anderen Kodierungen zulässt.

Das Signieren von annotierten Tags während des Imports aus fast-import heraus wird nicht unterstützt. Der Versuch, Ihre eigene PGP/GPG-Signatur einzufügen, wird nicht empfohlen, da das Frontend keinen (einfachen) Zugriff auf die vollständige Menge von Bytes hat, die normalerweise in eine solche Signatur eingehen. Wenn eine Signierung erforderlich ist, erstellen Sie leichte Tags aus fast-import heraus mit reset, und erstellen Sie dann die annotierten Versionen dieser Tags offline mit dem Standardprozess git tag.

reset

Erstellt (oder erstellt neu) den benannten Branch, optional beginnend mit einer bestimmten Revision. Der Reset-Befehl erlaubt es einem Frontend, einen neuen from-Befehl für einen vorhandenen Branch auszugeben oder einen neuen Branch aus einem vorhandenen Commit zu erstellen, ohne einen neuen Commit zu erstellen.

	'reset' SP <ref> LF
	('from' SP <commit-ish> LF)?
	LF?

Eine detaillierte Beschreibung von <ref> und <commit-ish> finden Sie oben unter commit und from.

Das LF nach dem Befehl ist optional (war früher erforderlich).

Der reset-Befehl kann auch zum Erstellen von leichten (nicht-annotierten) Tags verwendet werden. Zum Beispiel

reset refs/tags/938
from :938

würde den leichten Tag refs/tags/938 erstellen, der auf den Commit-Mark :938 verweist.

blob

Fordert das Schreiben einer Dateirevision in die Packdatei an. Die Revision ist mit keinem Commit verbunden; diese Verbindung muss in einem nachfolgenden commit-Befehl hergestellt werden, indem der Blob über eine zugewiesene Markierung referenziert wird.

	'blob' LF
	mark?
	original-oid?
	data

Der Markierungsbefehl ist hier optional, da einige Frontends beschlossen haben, die Git SHA-1 für den Blob selbst zu generieren und diese direkt an commit zu übergeben. Dies ist in der Regel mehr Arbeit, als es wert ist, da Markierungen kostengünstig zu speichern und einfach zu verwenden sind.

data

Liefert Rohdaten (zur Verwendung als Blob/Dateiinhalte, Commit-Nachrichten oder annotierte Tag-Nachrichten) an fast-import. Daten können mit einer exakten Byte-Anzahl oder durch ein abschließendes Zeilenende geliefert werden. Reale Frontends, die für produktionsreife Konvertierungen bestimmt sind, sollten immer das Format mit exakter Byte-Anzahl verwenden, da es robuster und performanter ist. Das begrenzte Format ist hauptsächlich für das Testen von fast-import bestimmt.

Kommentarzeilen, die im <raw>-Teil von data-Befehlen erscheinen, werden immer als Teil des Datenkörpers betrachtet und daher von fast-import nie ignoriert. Dies macht es sicher, beliebige Datei-/Nachrichteninhalte zu importieren, deren Zeilen mit # beginnen könnten.

Format mit exakter Byte-Anzahl

Das Frontend muss die Anzahl der Datenbytes angeben.

	'data' SP <count> LF
	<raw> LF?

wobei <count> die exakte Anzahl der Bytes ist, die in <raw> vorkommen. Der Wert von <count> wird als ASCII-Dezimalzahl ausgedrückt. Das LF auf beiden Seiten von <raw> ist nicht in <count> enthalten und wird nicht in die importierten Daten aufgenommen.

Das LF nach <raw> ist optional (war früher erforderlich), wird aber empfohlen. Wenn Sie es immer einschließen, wird das Debugging eines fast-import-Streams einfacher, da der nächste Befehl immer in Spalte 0 der nächsten Zeile beginnt, auch wenn <raw> nicht mit einem LF endete.

Begrenztes Format

Eine Trennzeichen-Zeichenkette wird verwendet, um das Ende der Daten zu markieren. fast-import berechnet die Länge, indem es nach dem Trennzeichen sucht. Dieses Format ist hauptsächlich zum Testen nützlich und wird für reale Daten nicht empfohlen.

	'data' SP '<<' <delim> LF
	<raw> LF
	<delim> LF
	LF?

wobei <delim> die gewählte Trennzeichen-Zeichenkette ist. Die Zeichenkette <delim> darf nicht auf einer eigenen Zeile innerhalb von <raw> erscheinen, da fast-import sonst denkt, die Daten enden früher als sie tatsächlich tun. Das LF, das unmittelbar auf <raw> folgt, ist Teil von <raw>. Dies ist eine der Einschränkungen des begrenzten Formats: Es ist unmöglich, einen Datenblock zu liefern, der kein LF als letztes Byte hat.

Das LF nach <delim> LF ist optional (war früher erforderlich).

alias

Zeichnet auf, dass eine Markierung auf ein bestimmtes Objekt verweist, ohne zuvor ein neues Objekt zu erstellen.

	'alias' LF
	mark
	'to' SP <commit-ish> LF
	LF?

Eine detaillierte Beschreibung von <commit-ish> finden Sie oben unter from.

checkpoint

Zwingt fast-import, die aktuelle Packdatei zu schließen, eine neue zu starten und alle aktuellen Branch-Refs, Tags und Markierungen zu speichern.

	'checkpoint' LF
	LF?

Beachten Sie, dass fast-import automatisch Packdateien wechselt, wenn die aktuelle Packdatei die Größe --max-pack-size oder 4 GiB erreicht, je nachdem, welche Grenze kleiner ist. Während eines automatischen Packdatei-Wechsels aktualisiert fast-import die Branch-Refs, Tags oder Markierungen nicht.

Da ein checkpoint erhebliche Mengen an CPU-Zeit und Festplatten-I/O erfordern kann (um die SHA-1-Prüfsumme der gesamten Packdatei zu berechnen, die entsprechende Indexdatei zu generieren und die Refs zu aktualisieren), kann es leicht mehrere Minuten dauern, bis ein einzelner checkpoint-Befehl abgeschlossen ist.

Frontends können sich entscheiden, Checkpoints während extrem großer und langwieriger Imports auszugeben, oder wenn sie einem anderen Git-Prozess den Zugriff auf einen Branch ermöglichen müssen. Angesichts der Tatsache, dass ein 30 GiB großes Subversion-Repository in etwa 3 Stunden über fast-import in Git geladen werden kann, ist explizites Checkpointing möglicherweise nicht notwendig.

Das LF nach dem Befehl ist optional (war früher erforderlich).

progress

Veranlasst fast-import, die gesamte progress-Zeile unverändert auf seinen Standardausgabekanal (Dateideskriptor 1) zu drucken, wenn der Befehl aus dem Eingabestrom verarbeitet wird. Der Befehl hat ansonsten keine Auswirkungen auf den aktuellen Import oder auf den internen Zustand von fast-import.

	'progress' SP <any> LF
	LF?

Der <any>-Teil des Befehls kann jede Zeichenkette enthalten, die kein LF enthält. Das LF nach dem Befehl ist optional. Aufrufer möchten die Ausgabe möglicherweise durch ein Werkzeug wie sed verarbeiten, um den führenden Teil der Zeile zu entfernen, zum Beispiel

frontend | git fast-import | sed 's/^progress //'

Das Platzieren eines progress-Befehls unmittelbar nach einem checkpoint informiert den Leser, wann der checkpoint abgeschlossen wurde und er sicher auf die von fast-import aktualisierten Refs zugreifen kann.

get-mark

Veranlasst fast-import, die SHA-1, die einer Markierung entspricht, auf stdout oder auf den Dateideskriptor zu drucken, der zuvor mit dem Argument --cat-blob-fd arrangiert wurde. Der Befehl hat ansonsten keine Auswirkungen auf den aktuellen Import; sein Zweck ist es, SHA-1s abzurufen, auf die spätere Commits in ihren Commit-Nachrichten verweisen könnten.

	'get-mark' SP ':' <idnum> LF

Siehe "Responses To Commands" unten für Details, wie diese Ausgabe sicher gelesen werden kann.

cat-blob

Veranlasst fast-import, einen Blob auf einen Dateideskriptor zu drucken, der zuvor mit dem Argument --cat-blob-fd arrangiert wurde. Der Befehl hat ansonsten keine Auswirkungen auf den aktuellen Import; sein Hauptzweck ist es, Blobs abzurufen, die sich möglicherweise im Speicher von fast-import befinden, aber nicht aus dem Ziel-Repository zugänglich sind.

	'cat-blob' SP <dataref> LF

Die <dataref> kann entweder eine Markierungsreferenz (:<idnum>) sein, die zuvor gesetzt wurde, oder eine vollständige 40-stellige SHA-1 eines Git-Blobs, die bereits existiert oder zum Schreiben bereit ist.

Die Ausgabe verwendet das gleiche Format wie git cat-file --batch

<sha1> SP 'blob' SP <size> LF
<contents> LF

Dieser Befehl kann dort verwendet werden, wo eine filemodify-Direktive erscheinen kann, wodurch er mitten in einem Commit verwendet werden kann. Für eine filemodify, die eine Inline-Direktive verwendet, kann er auch direkt vor der data-Direktive erscheinen.

Siehe "Responses To Commands" unten für Details, wie diese Ausgabe sicher gelesen werden kann.

ls

Druckt Informationen über das Objekt an einem Pfad auf einen Dateideskriptor, der zuvor mit dem Argument --cat-blob-fd arrangiert wurde. Dies ermöglicht das Drucken eines Blobs aus dem aktiven Commit (mit cat-blob) oder das Kopieren eines Blobs oder Baums aus einem vorherigen Commit zur Verwendung im aktuellen (mit filemodify).

Der ls-Befehl kann auch dort verwendet werden, wo eine filemodify-Direktive erscheinen kann, wodurch er mitten in einem Commit verwendet werden kann.

Lesen aus dem aktiven Commit

Diese Form kann nur mitten in einem commit verwendet werden. Der Pfad benennt einen Verzeichniseintrag innerhalb des aktiven Commits von fast-import. Der Pfad muss in diesem Fall zitiert werden.

	'ls' SP <path> LF
Lesen aus einem benannten Baum

Die <dataref> kann eine Markierungsreferenz (:<idnum>) oder die vollständige 40-stellige SHA-1 eines Git-Tags, Commits oder Baumobjekts sein, die bereits existiert oder zum Schreiben bereit ist. Der Pfad ist relativ zur obersten Ebene des Baumes, der von <dataref> benannt wird.

	'ls' SP <dataref> SP <path> LF

Siehe filemodify oben für eine detaillierte Beschreibung von <path>.

Die Ausgabe verwendet das gleiche Format wie git ls-tree <tree> -- <path>

<mode> SP ('blob' | 'tree' | 'commit') SP <dataref> HT <path> LF

Die <dataref> repräsentiert den Blob, Baum oder Commit-Objekt bei <path> und kann in späteren get-mark, cat-blob, filemodify oder ls Befehlen verwendet werden.

Wenn keine Datei oder kein Unterbaum unter diesem Pfad existiert, wird git fast-import stattdessen berichten

missing SP <path> LF

Siehe "Responses To Commands" unten für Details, wie diese Ausgabe sicher gelesen werden kann.

feature

Fordert, dass fast-import die angegebene Funktion unterstützt, oder bricht ab, wenn dies nicht der Fall ist.

	'feature' SP <feature> ('=' <argument>)? LF

Der <feature>-Teil des Befehls kann einer der folgenden sein

date-format
export-marks
relative-marks
no-relative-marks
force

Verhält sich so, als ob die entsprechende Befehlszeilenoption mit einem führenden -- auf der Befehlszeile übergeben worden wäre (siehe OPTIONS, oben).

import-marks
import-marks-if-exists

Ähnlich wie --import-marks, außer in zwei Punkten: Erstens ist nur ein "feature import-marks" oder "feature import-marks-if-exists" Befehl pro Stream erlaubt; zweitens überschreibt eine --import-marks= oder --import-marks-if-exists Befehlszeilenoption jede dieser "feature" Befehle im Stream; drittens überspringt "feature import-marks-if-exists" wie die entsprechende Befehlszeilenoption stillschweigend eine nicht existierende Datei.

get-mark
cat-blob
ls

Fordert, dass das Backend die Befehle get-mark, cat-blob oder ls unterstützt. Versionen von fast-import, die den angegebenen Befehl nicht unterstützen, werden mit einer entsprechenden Meldung beendet. Dies ermöglicht es dem Import, frühzeitig mit einer klaren Meldung abzubrechen, anstatt Zeit mit dem frühen Teil eines Imports zu verschwenden, bevor der nicht unterstützte Befehl erkannt wird.

notes

Fordert, dass das Backend den Unterbefehl notemodify (N) zum Befehl commit unterstützt. Versionen von fast-import, die Notizen nicht unterstützen, werden mit einer entsprechenden Meldung beendet.

done

Fehler melden, wenn der Stream ohne einen done-Befehl endet. Ohne diese Funktion können Fehler, die dazu führen, dass das Frontend an einer günstigen Stelle im Stream abrupt endet, unentdeckt bleiben. Dies kann zum Beispiel vorkommen, wenn ein Import-Frontend mitten im Betrieb abstürzt, ohne SIGTERM oder SIGKILL an seine untergeordnete git fast-import Instanz zu senden.

option

Verarbeitet die angegebene Option, damit git fast-import auf eine Weise arbeitet, die den Bedürfnissen des Frontends entspricht. Beachten Sie, dass vom Frontend angegebene Optionen durch Optionen überschrieben werden, die der Benutzer selbst an git fast-import angibt.

    'option' SP <option> LF

Der <option>-Teil des Befehls kann jede der im Abschnitt OPTIONS aufgeführten Optionen enthalten, die die Importsemantik nicht ändern, ohne das führende -- und wird auf die gleiche Weise behandelt.

Option-Befehle müssen die ersten Befehle in der Eingabe sein (nicht mitgezählt Feature-Befehle). Ein Optionsbefehl nach einem Nicht-Optionsbefehl ist ein Fehler.

Die folgenden Befehlszeilenoptionen ändern die Importsemantik und dürfen daher nicht als Option übergeben werden

  • date-format

  • import-marks

  • export-marks

  • cat-blob-fd

  • force

done

Wenn das done-Feature nicht verwendet wird, wird es so behandelt, als wäre EOF gelesen worden. Dies kann verwendet werden, um fast-import anzuweisen, frühzeitig zu beenden.

Wenn die Befehlszeilenoption --done oder der Befehl feature done verwendet wird, ist der Befehl done obligatorisch und markiert das Ende des Streams.

ANTWORTEN AUF BEFEHLE

Neue Objekte, die von fast-import geschrieben wurden, sind nicht sofort verfügbar. Die meisten fast-import-Befehle haben keine sichtbare Auswirkung bis zum nächsten Kontrollpunkt (oder Abschluss). Das Frontend kann Befehle senden, um die Eingangsleitung von fast-import zu füllen, ohne sich darum kümmern zu müssen, wie schnell sie wirksam werden, was die Leistung durch Vereinfachung der Zeitplanung verbessert.

Für einige Frontends ist es jedoch nützlich, Daten aus dem aktuellen Repository lesen zu können, während es aktualisiert wird (z. B. wenn das Quellmaterial Objekte in Bezug auf Patches beschreibt, die auf zuvor importierte Objekte angewendet werden sollen). Dies kann durch die Verbindung des Frontends und von fast-import über bidirektionale Leitungen erreicht werden.

mkfifo fast-import-output
frontend <fast-import-output |
git fast-import >fast-import-output

Ein auf diese Weise eingerichtetes Frontend kann die Befehle progress, get-mark, ls und cat-blob verwenden, um Informationen aus dem laufenden Import zu lesen.

Um Deadlocks zu vermeiden, müssen solche Frontends alle ausstehenden Ausgaben von progress, ls, get-mark und cat-blob vollständig verbrauchen, bevor Schreibvorgänge in fast-import durchgeführt werden, die blockieren könnten.

ABSTURZBERICHTE

Wenn fast-import ungültige Eingaben erhält, wird es mit einem Exit-Status ungleich Null beendet und erstellt einen Absturzbericht im obersten Verzeichnis des Git-Repositorys, in das importiert wurde. Absturzberichte enthalten einen Schnappschuss des internen fast-import-Zustands sowie die zuletzt ausgeführten Befehle, die zum Absturz geführt haben.

Alle kürzlich ausgeführten Befehle (einschließlich Stream-Kommentare, Dateiänderungen und Fortschrittsbefehle) werden im Befehlsverlauf des Absturzberichts angezeigt, rohe Dateidaten und Commit-Nachrichten sind jedoch aus dem Absturzbericht ausgeschlossen. Dieser Ausschluss spart Platz in der Berichtsdatei und reduziert die Menge an Pufferung, die fast-import während der Ausführung durchführen muss.

Nach dem Schreiben eines Absturzberichts schließt fast-import die aktuelle Packdatei und exportiert die Markierungstabelle. Dies ermöglicht es dem Frontend-Entwickler, den Repository-Zustand zu überprüfen und den Import von der Stelle aus fortzusetzen, an der er abgestürzt ist. Die geänderten Branches und Tags werden während eines Absturzes nicht aktualisiert, da der Import nicht erfolgreich abgeschlossen wurde. Branch- und Tag-Informationen finden sich im Absturzbericht und müssen manuell angewendet werden, wenn eine Aktualisierung erforderlich ist.

Ein Beispiel-Absturz

$ cat >in <<END_OF_INPUT
# my very first test commit
commit refs/heads/master
committer Shawn O. Pearce <spearce> 19283 -0400
# who is that guy anyway?
data <<EOF
this is my commit
EOF
M 644 inline .gitignore
data <<EOF
.gitignore
EOF
M 777 inline bob
END_OF_INPUT
$ git fast-import <in
fatal: Corrupt mode: M 777 inline bob
fast-import: dumping crash report to .git/fast_import_crash_8434
$ cat .git/fast_import_crash_8434
fast-import crash report:
    fast-import process: 8434
    parent process     : 1391
    at Sat Sep 1 00:58:12 2007
fatal: Corrupt mode: M 777 inline bob
Most Recent Commands Before Crash
---------------------------------
  # my very first test commit
  commit refs/heads/master
  committer Shawn O. Pearce <spearce> 19283 -0400
  # who is that guy anyway?
  data <<EOF
  M 644 inline .gitignore
  data <<EOF
* M 777 inline bob
Active Branch LRU
-----------------
    active_branches = 1 cur, 5 max
pos  clock name
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 1)      0 refs/heads/master
Inactive Branches
-----------------
refs/heads/master:
  status      : active loaded dirty
  tip commit  : 0000000000000000000000000000000000000000
  old tree    : 0000000000000000000000000000000000000000
  cur tree    : 0000000000000000000000000000000000000000
  commit clock: 0
  last pack   :
-------------------
END OF CRASH REPORT

TIPPS UND TRICKS

Die folgenden Tipps und Tricks wurden von verschiedenen Benutzern von fast-import gesammelt und werden hier als Vorschläge angeboten.

Verwenden Sie eine Markierung pro Commit

Verwenden Sie bei der Konvertierung eines Repositorys eine eindeutige Markierung pro Commit (mark :<n>) und übergeben Sie die Option --export-marks auf der Befehlszeile. fast-import gibt eine Datei aus, die jede Markierung und den entsprechenden Git-Objekt-SHA-1 auflistet. Wenn das Frontend die Markierungen mit dem Quellrepository verknüpfen kann, ist es einfach, die Genauigkeit und Vollständigkeit des Imports zu überprüfen, indem jeder Git-Commit mit der entsprechenden Quellrevision verglichen wird.

Wenn Sie von einem System wie Perforce oder Subversion kommen, sollte dies recht einfach sein, da die fast-import-Markierung auch die Perforce-Änderungssatznummer oder die Subversion-Revisionsnummer sein kann.

Springen Sie frei zwischen Branches

Versuchen Sie nicht, das Frontend zu optimieren, damit es während eines Imports bei einem Branch bleibt. Obwohl dies für fast-import etwas schneller sein mag, erhöht es die Komplexität des Frontend-Codes erheblich.

Der integrierte LRU-Branch in fast-import verhält sich tendenziell sehr gut, und die Kosten für die Aktivierung eines inaktiven Branches sind so gering, dass das Springen zwischen Branches praktisch keine Auswirkungen auf die Importleistung hat.

Umgang mit Umbenennungen

Beim Importieren einer umbenannten Datei oder eines Verzeichnisses löschen Sie einfach den/die alten Namen und ändern Sie den/die neuen Namen während des entsprechenden Commits. Git führt die Erkennung von Umbenennungen nachträglich durch, nicht explizit während eines Commits.

Verwenden Sie Tag-Fixup-Branches

Einige andere SCM-Systeme erlauben es dem Benutzer, ein Tag aus mehreren Dateien zu erstellen, die nicht aus demselben Commit/Änderungssatz stammen. Oder um Tags zu erstellen, die eine Teilmenge der im Repository verfügbaren Dateien sind.

Diese Tags in Git so zu importieren, wie sie sind, ist unmöglich, ohne mindestens einen Commit zu erstellen, der die Dateien "korrigiert", um dem Inhalt des Tags zu entsprechen. Verwenden Sie den Befehl reset von fast-import, um einen Dummy-Branch außerhalb Ihres normalen Branch-Bereichs auf den Basis-Commit für das Tag zurückzusetzen, dann committen Sie einen oder mehrere Datei-Fixup-Commits und taggen Sie schließlich den Dummy-Branch.

Da zum Beispiel alle normalen Branches unter dem Namen refs/heads/ gespeichert sind, nennen Sie den Tag-Fixup-Branch TAG_FIXUP. So ist es für den vom Importeur verwendeten Fixup-Branch unmöglich, Namensraumkonflikte mit echten Branches zu haben, die aus der Quelle importiert wurden (der Name TAG_FIXUP ist nicht refs/heads/TAG_FIXUP).

Berücksichtigen Sie beim Committen von Fixups die Verwendung von merge, um die Commits, die Dateirevisionen liefern, mit dem Fixup-Branch zu verbinden. Dies ermöglicht es Tools wie *git blame*, durch die tatsächliche Commit-Historie zu verfolgen und die Quelldateien ordnungsgemäß zu annotieren.

Nachdem fast-import beendet ist, muss das Frontend rm .git/TAG_FIXUP ausführen, um den Dummy-Branch zu entfernen.

Jetzt importieren, später neu verpacken

Sobald fast-import abgeschlossen ist, ist das Git-Repository vollständig gültig und einsatzbereit. Dies dauert in der Regel nur sehr kurze Zeit, selbst für beträchtlich große Projekte (100.000+ Commits).

Das erneute Verpacken des Repositorys ist jedoch erforderlich, um die Datenlokalität und die Zugriffsleistung zu verbessern. Dies kann auch Stunden bei extrem großen Projekten dauern (insbesondere bei Verwendung von -f und einem großen --window-Parameter). Da das erneute Verpacken sicher parallel zu Lesern und Schreibern ausgeführt werden kann, führen Sie das erneute Verpacken im Hintergrund aus und lassen Sie es beenden, wenn es fertig ist. Es gibt keinen Grund, auf die Erkundung Ihres neuen Git-Projekts zu warten!

Wenn Sie darauf warten, dass das erneute Verpacken abgeschlossen ist, versuchen Sie nicht, Benchmarks oder Leistungstests auszuführen, bis das erneute Verpacken abgeschlossen ist. fast-import gibt suboptimale Packdateien aus, die in realen Anwendungssituationen einfach nie gesehen werden.

Historische Daten neu verpacken

Wenn Sie sehr alte importierte Daten (z. B. älter als das letzte Jahr) neu verpacken, erwägen Sie, etwas zusätzliche CPU-Zeit aufzuwenden und --window=50 (oder höher) anzugeben, wenn Sie *git repack* ausführen. Dies dauert länger, führt aber auch zu einer kleineren Packdatei. Sie müssen den Aufwand nur einmal betreiben, und jeder, der Ihr Projekt nutzt, profitiert von dem kleineren Repository.

Einige Fortschrittsnachrichten einfügen

Senden Sie ab und zu eine progress-Nachricht von Ihrem Frontend an fast-import. Der Inhalt der Nachrichten ist völlig frei gestaltbar. Ein Vorschlag wäre, den aktuellen Monat und das aktuelle Jahr auszugeben, jedes Mal, wenn das Datum des aktuellen Commits in den nächsten Monat übergeht. Ihre Benutzer werden sich besser fühlen, wenn sie wissen, wie viel vom Datenstrom verarbeitet wurde.

PACKFILE-OPTIMIERUNG

Beim Verpacken eines Blobs versucht fast-import immer, gegen den zuletzt geschriebenen Blob zu deltifizieren. Sofern nicht vom Frontend speziell arrangiert, wird dies wahrscheinlich keine frühere Version derselben Datei sein, so dass das generierte Delta nicht das kleinstmögliche ist. Die resultierende Packdatei wird komprimiert, aber nicht optimal sein.

Frontends, die effizienten Zugriff auf alle Revisionen einer einzelnen Datei haben (z. B. das Lesen einer RCS/CVS ,v-Datei), können wählen, alle Revisionen dieser Datei als eine Sequenz von aufeinanderfolgenden blob-Befehlen bereitzustellen. Dies ermöglicht es fast-import, die verschiedenen Dateirevisionen gegeneinander zu deltifizieren und Platz in der endgültigen Packdatei zu sparen. Markierungen können verwendet werden, um einzelne Dateirevisionen später während einer Sequenz von commit-Befehlen zu identifizieren.

Die von fast-import erstellten Packdateien begünstigen keine guten Plattenspeicherzugriffsmuster. Dies liegt daran, dass fast-import die Daten in der Reihenfolge schreibt, in der sie auf der Standardeingabe empfangen werden, während Git typischerweise Daten innerhalb von Packdateien organisiert, um die aktuellste (aktuelle Spitze) vor historischen Daten zu platzieren. Git gruppiert auch Commits zusammen, was die Traversierung von Revisionen durch bessere Cache-Lokalität beschleunigt.

Aus diesem Grund wird dringend empfohlen, dass Benutzer das Repository nach Abschluss von fast-import mit git repack -a -d neu verpacken, damit Git die Packdateien für einen schnelleren Datenzugriff neu organisieren kann. Wenn die Blob-Deltas suboptimale sind (siehe oben), kann das Hinzufügen der Option -f, um die Neuberechnung aller Deltas zu erzwingen, die endgültige Packdateigröße erheblich reduzieren (30-50% kleiner sind durchaus typisch).

Anstatt git repack auszuführen, können Sie auch git gc --aggressive ausführen, was nach einem Import auch andere Dinge optimiert (z. B. loses Referenzieren). Wie im Abschnitt "AGGRESSIVE" in git-gc[1] erwähnt, findet die Option --aggressive neue Deltas mit der Option -f für git-repack[1]. Aus den oben genannten Gründen ist die Verwendung von --aggressive nach einem fast-import einer der wenigen Fälle, in denen sie sich als lohnend erweist.

SPEICHERAUSLASTUNG

Es gibt eine Reihe von Faktoren, die beeinflussen, wie viel Speicher fast-import für einen Import benötigt. Wie kritische Teile des Kern-Git verwendet fast-import seine eigenen Speicherallokatoren, um alle mit malloc verbundenen Overheadkosten zu amortisieren. In der Praxis amortisiert fast-import alle malloc-Overheads auf 0, da es große Blockallokationen verwendet.

pro Objekt

fast-import unterhält eine In-Memory-Struktur für jedes in dieser Ausführung geschriebene Objekt. Auf einem 32-Bit-System ist die Struktur 32 Bytes groß, auf einem 64-Bit-System ist die Struktur 40 Bytes groß (aufgrund der größeren Zeigergrößen). Objekte in der Tabelle werden erst freigegeben, wenn fast-import beendet wird. Der Import von 2 Millionen Objekten auf einem 32-Bit-System erfordert ungefähr 64 MiB Speicher.

Die Objekttabelle ist tatsächlich eine Hashtabelle, die auf dem Objektnamen (dem eindeutigen SHA-1) basiert. Diese Speicheraufteilung ermöglicht es fast-import, ein vorhandenes oder bereits geschriebenes Objekt wiederzuverwenden und Duplikate in der Ausgabe-Packdatei zu vermeiden. Doppelte Blobs sind bei einem Import überraschend häufig, typischerweise aufgrund von Branch-Merges in der Quelle.

pro Markierung

Markierungen werden in einem spärlichen Array gespeichert und verwenden 1 Zeiger (4 Bytes oder 8 Bytes, abhängig von der Zeigergröße) pro Markierung. Obwohl das Array spärlich ist, wird Frontends dringend empfohlen, Markierungen zwischen 1 und n zu verwenden, wobei n die Gesamtzahl der für diesen Import erforderlichen Markierungen ist.

pro Branch

Branches werden als aktiv und inaktiv klassifiziert. Der Speicherverbrauch der beiden Klassen ist signifikant unterschiedlich.

Inaktive Branches werden in einer Struktur gespeichert, die 96 oder 120 Bytes (32-Bit bzw. 64-Bit-Systeme) zuzüglich der Länge des Branch-Namens (typischerweise unter 200 Bytes) pro Branch verwendet. fast-import kann problemlos bis zu 10.000 inaktive Branches in weniger als 2 MiB Speicher verwalten.

Aktive Branches haben den gleichen Overhead wie inaktive Branches, enthalten aber auch Kopien jedes Baums, der auf diesem Branch kürzlich geändert wurde. Wenn die Unterverzeichnis include seit der Aktivierung des Branches nicht geändert wurde, werden ihre Inhalte nicht in den Speicher geladen, aber wenn das Unterverzeichnis src seit der Aktivierung des Branches durch einen Commit geändert wurde, werden seine Inhalte in den Speicher geladen.

Da aktive Branches Metadaten über die auf diesem Branch enthaltenen Dateien speichern, kann ihre In-Memory-Speichergröße beträchtlich anwachsen (siehe unten).

fast-import verschiebt aktive Branches automatisch in den inaktiven Status, basierend auf einem einfachen LRU-Algorithmus (Least Recently Used). Die LRU-Kette wird bei jedem commit-Befehl aktualisiert. Die maximale Anzahl aktiver Branches kann auf der Befehlszeile mit --active-branches= erhöht oder verringert werden.

pro aktivem Baum

Bäume (auch Verzeichnisse genannt) verbrauchen nur 12 Bytes Speicher zusätzlich zu dem für ihre Einträge benötigten Speicher (siehe "pro aktivem Dateieintrag" unten). Die Kosten eines Baums sind praktisch 0, da sein Overhead über die einzelnen Dateieinträge amortisiert wird.

pro aktivem Dateieintrag

Dateien (und Verweise auf Unterbäume) innerhalb aktiver Bäume erfordern 52 oder 64 Bytes (32/64-Bit-Plattformen) pro Eintrag. Um Speicher zu sparen, werden Datei- und Baum-Namen in einer gemeinsamen Stringtabelle zusammengefasst, wodurch der Dateiname "Makefile" nur 16 Bytes (einschließlich des String-Header-Overheads) verbraucht, unabhängig davon, wie oft er im Projekt vorkommt.

Die aktive Branch LRU ermöglicht es fast-import, in Verbindung mit dem Dateinamen-Stringpool und der verzögerten Ladung von Unterbäumen, Projekte mit über 2.000 Branches und über 45.114 Dateien mit einem sehr begrenzten Speicherfußabdruck (weniger als 2,7 MiB pro aktivem Branch) effizient zu importieren.

SIGNALE

Das Senden von **SIGUSR1** an den *git fast-import*-Prozess beendet die aktuelle Packdatei vorzeitig und simuliert einen checkpoint-Befehl. Ungeduldige Bediener können diese Einrichtung nutzen, um Objekte und Referenzen eines laufenden Imports einzusehen, auf Kosten von etwas zusätzlicher Laufzeit und schlechterer Komprimierung.

KONFIGURATION

Alles unterhalb dieser Zeile in diesem Abschnitt wird selektiv aus der git-config[1]-Dokumentation übernommen. Der Inhalt ist derselbe wie dort zu finden.

fastimport.unpackLimit

Wenn die Anzahl der von git-fast-import[1] importierten Objekte unter diesem Grenzwert liegt, werden die Objekte in lose Objektdateien entpackt. Wenn die Anzahl der importierten Objekte diesen Grenzwert jedoch erreicht oder überschreitet, wird das Pack als Pack gespeichert. Das Speichern des Packs aus einem fast-import kann den Importvorgang beschleunigen, insbesondere auf langsamen Dateisystemen. Wenn nicht gesetzt, wird der Wert von transfer.unpackLimit verwendet.

SIEHE AUCH

GIT

Teil der git[1] Suite