Einrichtung und Konfiguration
Projekte holen und erstellen
Grundlegende Snapshots
Branching und Merging
Projekte teilen und aktualisieren
Inspektion und Vergleich
Patching
Debugging
Externe Systeme
Server-Administration
Anleitungen
- gitattributes
- Konventionen der Kommandozeile
- Tägliches Git
- Häufig gestellte Fragen (FAQ)
- Glossar
- Hooks
- gitignore
- gitmodules
- Revisionen
- Submodule
- Tutorial
- Workflows
- Alle Anleitungen...
Administration
Plumbing-Befehle
-
2.52.0
2025-11-17
- 2.45.4 → 2.51.2 keine Änderungen
-
2.45.3
2024-11-26
- 2.43.1 → 2.45.2 keine Änderungen
-
2.43.0
2023-11-20
- 2.38.1 → 2.42.4 keine Änderungen
-
2.38.0
2022-10-02
- 2.36.1 → 2.37.7 keine Änderungen
-
2.36.0
2022-04-18
- 2.30.2 → 2.35.8 keine Änderungen
-
2.30.1
2021-02-08
- 2.25.2 → 2.30.0 keine Änderungen
-
2.25.1
2020-02-17
-
2.25.0
2020-01-13
- 2.19.1 → 2.24.4 keine Änderungen
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 keine Änderungen
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 keine Änderungen
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
- 2.10.5 → 2.12.5 keine Änderungen
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.7.6 keine Änderungen
-
2.6.7
2017-05-05
-
2.5.6
2017-05-05
- 2.4.12 keine Änderungen
-
2.3.10
2015-09-28
-
2.2.3
2015-09-04
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
SYNOPSIS
git update-index
[--add] [--remove | --force-remove] [--replace]
[--refresh] [-q] [--unmerged] [--ignore-missing]
[(--cacheinfo <mode>,<object>,<file>)…]
[--chmod=(+|-)x]
[--[no-]assume-unchanged]
[--[no-]skip-worktree]
[--[no-]ignore-skip-worktree-entries]
[--[no-]fsmonitor-valid]
[--ignore-submodules]
[--[no-]split-index]
[--[no-|test-|force-]untracked-cache]
[--[no-]fsmonitor]
[--really-refresh] [--unresolve] [--again | -g]
[--info-only] [--index-info]
[-z] [--stdin] [--index-version <n>]
[--show-index-version]
[--verbose]
[--] [<file>…]
BESCHREIBUNG
Modifiziert den Index. Jede erwähnte Datei wird im Index aktualisiert und jeder Zustand "unmerged" oder "needs updating" wird gelöscht.
Siehe auch git-add[1] für eine benutzerfreundlichere Methode, einige der häufigsten Operationen auf dem Index durchzuführen.
Die Art und Weise, wie git update-index Dateien behandelt, über die es informiert wird, kann mit den verschiedenen Optionen modifiziert werden
OPTIONEN
- --add
-
Wenn eine angegebene Datei noch nicht im Index vorhanden ist, wird sie hinzugefügt. Das Standardverhalten ist, neue Dateien zu ignorieren.
- --remove
-
Wenn eine angegebene Datei im Index vorhanden ist, aber fehlt, wird sie entfernt. Das Standardverhalten ist, entfernte Dateien zu ignorieren.
- --refresh
-
Überprüft den aktuellen Index und prüft anhand der stat() Informationen, ob Merges oder Updates erforderlich sind.
- -q
-
Leise. Wenn --refresh feststellt, dass der Index ein Update benötigt, bricht das Standardverhalten mit einem Fehler ab. Diese Option bewirkt, dass git update-index trotzdem fortfährt.
- --ignore-submodules
-
Versucht nicht, Submodule zu aktualisieren. Diese Option wird nur berücksichtigt, wenn sie vor --refresh übergeben wird.
- --unmerged
-
Wenn --refresh unmerged Änderungen im Index feststellt, bricht das Standardverhalten mit einem Fehler ab. Diese Option bewirkt, dass git update-index trotzdem fortfährt.
- --ignore-missing
-
Ignoriert fehlende Dateien während eines --refresh
- --cacheinfo <mode>,<object>,<path>
- --cacheinfo <mode> <object> <path>
-
Fügt die angegebenen Informationen direkt in den Index ein. Aus Gründen der Abwärtskompatibilität können Sie diese drei Argumente auch als drei separate Parameter übergeben, aber neuen Benutzern wird empfohlen, die Ein-Parameter-Form zu verwenden.
- --index-info
-
Liest Indexinformationen von stdin.
- --chmod=(+|-)x
-
Setzt die Ausführungsrechte für die aktualisierten Dateien.
- --assume-unchanged
- --no-assume-unchanged
-
Wenn dieses Flag gesetzt ist, werden die für die Pfade aufgezeichneten Objektnamen nicht aktualisiert. Stattdessen setzt diese Option das "assume unchanged"-Bit für die Pfade. Wenn das "assume unchanged"-Bit gesetzt ist, verspricht der Benutzer, die Datei nicht zu ändern, und Git darf davon ausgehen, dass die Arbeitsverzeichnisdatei mit dem im Index aufgezeichneten übereinstimmt. Wenn Sie die Arbeitsverzeichnisdatei ändern möchten, müssen Sie das Bit unsetzen, um Git darüber zu informieren. Dies kann manchmal hilfreich sein, wenn Sie mit einem großen Projekt auf einem Dateisystem arbeiten, das einen sehr langsamen lstat(2) Systemaufruf hat (z.B. cifs).
Git wird fehlschlagen (gracefully), falls es diese Datei im Index ändern muss, z.B. beim Mergen eines Commits; daher müssen Sie, falls die angenommene, nicht getrackte Datei im Upstream geändert wurde, die Situation manuell handhaben.
- --really-refresh
-
Ähnlich wie
--refresh, aber prüft die stat-Informationen bedingungslos, ohne Rücksicht auf die "assume unchanged"-Einstellung. - --skip-worktree
- --no-skip-worktree
-
Wenn eines dieser Flags gesetzt ist, werden die für die Pfade aufgezeichneten Objektnamen nicht aktualisiert. Stattdessen setzen und unsetzen diese Optionen das "skip-worktree"-Bit für die Pfade. Weitere Informationen finden Sie im Abschnitt "Skip-worktree bit" unten.
- --ignore-skip-worktree-entries
- --no-ignore-skip-worktree-entries
-
Entfernt keine skip-worktree (auch bekannt als "index-only") Einträge, selbst wenn die Option
--removeangegeben wurde. - --fsmonitor-valid
- --no-fsmonitor-valid
-
Wenn eines dieser Flags gesetzt ist, werden die für die Pfade aufgezeichneten Objektnamen nicht aktualisiert. Stattdessen setzen und unsetzen diese Optionen das "fsmonitor valid"-Bit für die Pfade. Weitere Informationen finden Sie im Abschnitt "File System Monitor" unten.
- -g
- --again
-
Führt git update-index selbst auf den Pfaden aus, deren Indexeinträge sich von denen des
HEADCommits unterscheiden. - --unresolve
-
Stellt den Zustand "unmerged" oder "needs updating" einer Datei während eines Merges wieder her, wenn er versehentlich gelöscht wurde.
- --info-only
-
Erstellt keine Objekte in der Objekt-Datenbank für alle <file> Argumente, die dieser Flag folgen; fügt nur deren Objekt-IDs in den Index ein.
- --force-remove
-
Entfernt die Datei aus dem Index, auch wenn das Arbeitsverzeichnis noch eine solche Datei enthält. (Impliziert --remove.)
- --replace
-
Standardmäßig weigert sich git update-index, wenn eine Datei
pathim Index vorhanden ist, den Versuch,path/filehinzuzufügen. Ebenso, wenn eine Dateipath/fileexistiert, kann eine Dateipathnicht hinzugefügt werden. Mit der Flag --replace werden existierende Einträge, die mit dem hinzuzufügenden Eintrag kollidieren, automatisch unter Warnmeldungen entfernt. - --stdin
-
Anstatt eine Liste von Pfaden von der Befehlszeile zu nehmen, liest eine Liste von Pfaden von der Standardeingabe. Pfade sind standardmäßig durch LF (d.h. ein Pfad pro Zeile) getrennt.
- --verbose
-
Berichtet, was aus dem Index hinzugefügt und entfernt wird.
- --index-version <n>
-
Schreibt den resultierenden Index im benannten On-Disk-Format aus. Unterstützte Versionen sind 2, 3 und 4. Die aktuelle Standardversion ist 2 oder 3, je nachdem, ob zusätzliche Features verwendet werden, wie z.B.
gitadd-N. Mit--verbosewird auch die Version gemeldet, die die Indexdatei vor und nach diesem Befehl verwendet.Version 4 führt eine einfache Pfadnamenkomprimierung durch, die die Indexgröße in großen Repositories um 30-50% reduziert, was zu schnelleren Ladezeiten führt. Git unterstützt dies seit Version 1.8.0, veröffentlicht im Oktober 2012, und die Unterstützung dafür wurde 2016 zu libgit2 und 2020 zu JGit hinzugefügt. Ältere Versionen dieser Handbuchseite nannten sie "relativ jung", aber sie sollte heutzutage als ausgereifte Technologie betrachtet werden.
- --show-index-version
-
Berichtet die Indexformatversion, die von der On-Disk-Indexdatei verwendet wird. Siehe
--index-versionoben. - -z
-
Nur aussagekräftig mit
--stdinoder--index-info; Pfade werden durch ein NUL-Zeichen anstelle von LF getrennt. - --split-index
- --no-split-index
-
Aktiviert oder deaktiviert den Split-Index-Modus. Wenn der Split-Index-Modus bereits aktiviert ist und
--split-indexerneut angegeben wird, werden alle Änderungen in $GIT_DIR/index zurück in die gemeinsame Indexdatei geschrieben.Diese Optionen werden unabhängig vom Wert der Konfigurationsvariable
core.splitIndex(siehe git-config[1]) wirksam. Es wird jedoch eine Warnung ausgegeben, wenn die Änderung gegen den konfigurierten Wert verstößt, da der konfigurierte Wert beim nächsten Lesen des Index wirksam wird und die beabsichtigte Wirkung der Option aufhebt. - --untracked-cache
- --no-untracked-cache
-
Aktiviert oder deaktiviert das Untracked-Cache-Feature. Bitte verwenden Sie
--test-untracked-cache, bevor Sie es aktivieren.Diese Optionen werden unabhängig vom Wert der Konfigurationsvariable
core.untrackedCache(siehe git-config[1]) wirksam. Es wird jedoch eine Warnung ausgegeben, wenn die Änderung gegen den konfigurierten Wert verstößt, da der konfigurierte Wert beim nächsten Lesen des Index wirksam wird und die beabsichtigte Wirkung der Option aufhebt. - --test-untracked-cache
-
Führt nur Tests im Arbeitsverzeichnis durch, um sicherzustellen, dass der Untracked-Cache verwendet werden kann. Sie müssen den Untracked-Cache anschließend manuell mit
--untracked-cacheoder--force-untracked-cacheoder der Konfigurationsvariablecore.untrackedCacheaktivieren, wenn Sie ihn wirklich verwenden möchten. Wenn ein Test fehlschlägt, ist der Exit-Code 1 und eine Meldung erklärt, was nicht wie benötigt funktioniert, andernfalls ist der Exit-Code 0 und OK wird ausgegeben. - --force-untracked-cache
-
Gleichbedeutend mit
--untracked-cache. Bietet Abwärtskompatibilität mit älteren Git-Versionen, bei denen--untracked-cache--test-untracked-cacheimplizierte, diese Option aber die Erweiterung bedingungslos aktivieren würde. - --fsmonitor
- --no-fsmonitor
-
Aktiviert oder deaktiviert das Dateisystem-Monitor-Feature. Diese Optionen werden unabhängig vom Wert der Konfigurationsvariable
core.fsmonitor(siehe git-config[1]) wirksam. Es wird jedoch eine Warnung ausgegeben, wenn die Änderung gegen den konfigurierten Wert verstößt, da der konfigurierte Wert beim nächsten Lesen des Index wirksam wird und die beabsichtigte Wirkung der Option aufhebt. - --
-
Interpretiere keine weiteren Argumente mehr als Optionen.
- <file>
-
Zu bearbeitende Dateien. Beachten Sie, dass Dateien, die mit . beginnen, verworfen werden. Dies schließt
./fileunddir/./fileein. Wenn Sie dies nicht wünschen, verwenden Sie eindeutigere Namen. Das Gleiche gilt für Verzeichnisse, die mit / enden, und Pfade mit //
VERWENDUNG VON --REFRESH
--refresh berechnet kein neues sha1-File und aktualisiert den Index nicht auf den neuesten Stand für Modus-/Inhaltsänderungen. Was es jedoch tut, ist, die stat-Informationen einer Datei mit dem Index zu "neu abzugleichen", damit Sie den Index für eine Datei auffrischen können, die nicht geändert wurde, bei der aber der stat-Eintrag veraltet ist.
Zum Beispiel würden Sie dies nach einem git read-tree tun wollen, um die stat-Indexdetails mit den richtigen Dateien zu verknüpfen.
VERWENDUNG VON --CACHEINFO ODER --INFO-ONLY
--cacheinfo wird verwendet, um eine Datei zu registrieren, die sich nicht im aktuellen Arbeitsverzeichnis befindet. Dies ist nützlich für Minimum-Checkout-Merges.
Um vorzutäuschen, dass Sie eine Datei unter dem Pfad mit Modus und sha1 haben, sagen Sie
$ git update-index --add --cacheinfo <mode>,<sha1>,<path>
--info-only wird verwendet, um Dateien zu registrieren, ohne sie in die Objekt-Datenbank zu legen. Dies ist nützlich für reine Status-Repositories.
Beide Befehle, --cacheinfo und --info-only, verhalten sich ähnlich: Der Index wird aktualisiert, aber die Objekt-Datenbank nicht. --cacheinfo ist nützlich, wenn das Objekt in der Datenbank ist, die Datei aber lokal nicht verfügbar ist. --info-only ist nützlich, wenn die Datei verfügbar ist, Sie aber die Objekt-Datenbank nicht aktualisieren möchten.
VERWENDUNG VON --INDEX-INFO
--index-info ist ein leistungsfähigerer Mechanismus, der es Ihnen ermöglicht, mehrere Eintragsdefinitionen von der Standardeingabe zu verarbeiten und ist speziell für Skripte konzipiert. Er kann Eingaben in drei Formaten annehmen:
-
mode SP type SP sha1 TAB path
Dieses Format dient dazu, die Ausgabe von
gitls-treein den Index einzufügen. -
mode SP sha1 SP stage TAB path
Dieses Format dient dazu, höhere Stages in die Indexdatei einzufügen und entspricht der Ausgabe von git ls-files --stage.
-
mode SP sha1 TAB path
Dieses Format wird von keinem Git-Befehl mehr erzeugt, wird aber von
update-index--index-infounterstützt und wird dies auch weiterhin tun.
Um einen Eintrag höherer Stufe in den Index einzufügen, sollte der Pfad zunächst durch Übergabe eines Eintrags mit mode=0 für den Pfad entfernt und dann die notwendigen Eingabezeilen im dritten Format übergeben werden.
Beispiel: Beginnen Sie mit diesem Index
$ git ls-files -s 100644 8a1218a1024a212bb3db30becd860315f9f3ac52 0 frotz
Sie können die folgende Eingabe an --index-info übergeben
$ git update-index --index-info 0 0000000000000000000000000000000000000000 frotz 100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1 frotz 100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2 frotz
Die erste Zeile der Eingabe übergibt 0 als Modus, um den Pfad zu entfernen; der SHA-1 spielt keine Rolle, solange er korrekt formatiert ist. Dann übergeben die zweite und dritte Zeile die Einträge für Stage 1 und Stage 2 für diesen Pfad. Danach hätten wir folgendes Ergebnis:
$ git ls-files -s 100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1 frotz 100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2 frotz
VERWENDUNG DES "ASSUME UNCHANGED" BITS
Viele Operationen in Git hängen von einer effizienten lstat(2) Implementierung Ihres Dateisystems ab, sodass die st_mtime-Informationen für Arbeitsverzeichnisdateien kostengünstig geprüft werden können, um festzustellen, ob sich der Dateiinhalt von der im Index gespeicherten Version geändert hat. Leider haben einige Dateisysteme ineffiziente lstat(2)-Aufrufe. Wenn Ihr Dateisystem eines davon ist, können Sie das "assume unchanged"-Bit für Pfade setzen, die Sie nicht geändert haben, damit Git diese Prüfung nicht durchführt. Beachten Sie, dass das Setzen dieses Bits für einen Pfad nicht bedeutet, dass Git den Dateiinhalt auf Änderungen prüft – es bewirkt, dass Git jegliche Prüfung weglässt und davon ausgeht, dass er sich **nicht** geändert hat. Wenn Sie Änderungen an Arbeitsverzeichnisdateien vornehmen, müssen Sie Git dies explizit mitteilen, indem Sie das "assume unchanged"-Bit fallen lassen, entweder bevor oder nachdem Sie sie ändern.
Um das "assume unchanged"-Bit zu setzen, verwenden Sie die Option --assume-unchanged. Zum Löschen verwenden Sie --no-assume-unchanged. Um zu sehen, welche Dateien das "assume unchanged"-Bit gesetzt haben, verwenden Sie git ls-files -v (siehe git-ls-files[1]).
Der Befehl betrachtet die Konfigurationsvariable core.ignorestat. Wenn diese wahr ist, werden Pfade, die mit git update-index paths... aktualisiert wurden, und Pfade, die mit anderen Git-Befehlen aktualisiert wurden, die sowohl den Index als auch das Arbeitsverzeichnis aktualisieren (z.B. git apply --index, git checkout-index -u und git read-tree -u), automatisch als "assume unchanged" markiert. Beachten Sie, dass das "assume unchanged"-Bit **nicht** gesetzt wird, wenn git update-index --refresh feststellt, dass die Arbeitsverzeichnisdatei mit dem Index übereinstimmt (verwenden Sie git update-index --really-refresh, wenn Sie sie als "assume unchanged" markieren möchten).
Manchmal verwechseln Benutzer das "assume-unchanged"-Bit mit dem "skip-worktree"-Bit. Siehe den letzten Absatz im Abschnitt "Skip-worktree bit" unten für eine Erklärung der Unterschiede.
BEISPIELE
Um nur die bereits ausgecheckten Dateien zu aktualisieren und aufzufrischen
$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh
- Auf einem ineffizienten Dateisystem mit gesetzter
core.ignorestat -
$ git update-index --really-refresh (1) $ git update-index --no-assume-unchanged foo.c (2) $ git diff --name-only (3) $ edit foo.c $ git diff --name-only (4) M foo.c $ git update-index foo.c (5) $ git diff --name-only (6) $ edit foo.c $ git diff --name-only (7) $ git update-index --no-assume-unchanged foo.c (8) $ git diff --name-only (9) M foo.c
-
erzwingt lstat(2), um die "assume unchanged"-Bits für Pfade zu setzen, die dem Index entsprechen.
-
markiert den Pfad zur Bearbeitung.
-
führt lstat(2) aus und stellt fest, dass der Index mit dem Pfad übereinstimmt.
-
führt lstat(2) aus und stellt fest, dass der Index **nicht** mit dem Pfad übereinstimmt.
-
das Registrieren der neuen Version im Index setzt das "assume unchanged"-Bit.
-
und es wird als unverändert angenommen.
-
auch nachdem Sie es bearbeitet haben.
-
Sie können die Änderung nach dem Zeitpunkt mitteilen.
-
jetzt prüft es mit lstat(2) und stellt fest, dass es geändert wurde.
-
SKIP-WORKTREE BIT
Das Skip-Worktree-Bit kann in einem (langen) Satz definiert werden: Sagt Git, dass die Datei nach Möglichkeit nicht in das Arbeitsverzeichnis geschrieben werden soll und die Datei als unverändert behandelt werden soll, wenn sie nicht im Arbeitsverzeichnis vorhanden ist.
Beachten Sie, dass nicht alle Git-Befehle auf dieses Bit achten und einige es nur teilweise unterstützen.
Die Flags von update-index und die Fähigkeiten von read-tree im Zusammenhang mit dem skip-worktree-Bit entstanden vor der Einführung des Befehls git-sparse-checkout[1], der eine viel einfachere Möglichkeit bietet, die skip-worktree-Bits zu konfigurieren und zu handhaben. Wenn Sie Ihr Arbeitsverzeichnis auf eine Teilmenge der Dateien im Repository reduzieren möchten, empfehlen wir dringend die Verwendung von git-sparse-checkout[1] anstelle der Low-Level-Primitive update-index und read-tree.
Der Hauptzweck des skip-worktree-Bits ist die Ermöglichung von Sparse-Checkouts, d.h. Arbeitsverzeichnissen mit nur einer Teilmenge von vorhandenen Pfaden. Wenn das skip-worktree-Bit gesetzt ist, vermeiden Git-Befehle (wie z.B. switch, pull, merge) das Schreiben dieser Dateien. Diese Befehle schreiben diese Dateien jedoch manchmal trotzdem in wichtigen Fällen, wie z.B. bei Konflikten während eines Merges oder Rebases. Git-Befehle werden auch vermeiden, das Fehlen solcher Dateien als absichtliche Löschung zu behandeln; zum Beispiel wird git add -u keine Löschung für diese Dateien staged und git commit -a wird diese ebenfalls nicht löschen.
Obwohl dieses Bit dem "assume-unchanged"-Bit ähnelt, ist sein Ziel anders. Das "assume-unchanged"-Bit dient dazu, die Datei im Arbeitsverzeichnis zu belassen, aber Git anzuweisen, sie nicht auf Änderungen zu prüfen und davon auszugehen, dass die Datei nicht geändert wurde (obwohl, wenn es feststellen kann, ohne die Datei zu statten, dass sie geändert wurde, es die Änderungen aufzeichnen darf). skip-worktree weist Git an, das Fehlen der Datei zu ignorieren, sie bei Befehlen, die normalerweise einen Großteil des Arbeitsverzeichnisses aktualisieren (z.B. checkout, switch, pull usw.), nach Möglichkeit nicht zu aktualisieren und ihr Fehlen nicht in Commits aufzuzeichnen. Beachten Sie, dass in Sparse-Checkouts (eingerichtet durch git sparse-checkout oder durch Konfiguration von core.sparseCheckout auf true), wenn eine Datei im Index als skip-worktree markiert ist, aber im Arbeitsverzeichnis gefunden wird, Git das skip-worktree-Bit für diese Datei löscht.
SPLIT INDEX
Dieser Modus ist für Repositories mit sehr großen Indizes konzipiert und zielt darauf ab, die Zeit zu reduzieren, die zum wiederholten Schreiben dieser Indizes benötigt wird.
In diesem Modus ist der Index in zwei Dateien aufgeteilt: $GIT_DIR/index und $GIT_DIR/sharedindex.<SHA-1>. Änderungen werden in $GIT_DIR/index, dem Split-Index, gesammelt, während die gemeinsame Indexdatei alle Indexeinträge enthält und unverändert bleibt.
Alle Änderungen im Split-Index werden zurück in die gemeinsame Indexdatei geschrieben, wenn die Anzahl der Einträge im Split-Index ein Niveau erreicht, das durch die Konfigurationsvariable splitIndex.maxPercentChange festgelegt ist (siehe git-config[1]).
Jedes Mal, wenn eine neue gemeinsame Indexdatei erstellt wird, werden die alten gemeinsamen Indexdateien gelöscht, wenn ihre Änderungszeit älter ist als die, die durch die Konfigurationsvariable splitIndex.sharedIndexExpire angegeben ist (siehe git-config[1]).
Um eine gemeinsame Indexdatei, die noch verwendet wird, nicht zu löschen, wird ihre Änderungszeit bei jeder Erstellung oder jedem Lesen eines neuen Split-Indexes, der auf der gemeinsamen Indexdatei basiert, auf die aktuelle Zeit aktualisiert.
UNTRACKED CACHE
Dieser Cache soll die Geschwindigkeit von Befehlen erhöhen, die sich mit der Ermittlung von nicht nachverfolgten Dateien befassen, wie z.B. git status.
Diese Funktion funktioniert, indem sie die mtime der Verzeichnisse des Arbeitsverzeichnisses speichert und dann das Lesen von Verzeichnissen und stat-Aufrufe gegen Dateien in diesen Verzeichnissen auslässt, deren mtime sich nicht geändert hat. Damit dies funktioniert, müssen das zugrunde liegende Betriebssystem und das Dateisystem das Feld st_mtime von Verzeichnissen ändern, wenn Dateien in dem Verzeichnis hinzugefügt, geändert oder gelöscht werden.
Sie können testen, ob das Dateisystem dies unterstützt, mit der Option --test-untracked-cache. Die Option --untracked-cache führte in älteren Git-Versionen implizit diesen Test durch, aber das ist nicht mehr der Fall.
Wenn Sie diese Funktion aktivieren (oder deaktivieren) möchten, ist es einfacher, die Konfigurationsvariable core.untrackedCache (siehe git-config[1]) zu verwenden, als die Option --untracked-cache für git update-index in jedem Repository, insbesondere wenn Sie dies in allen von Ihnen verwendeten Repositories tun möchten, da Sie die Konfigurationsvariable einmalig in Ihrer $HOME/.gitconfig auf true (oder false) setzen können und dies alle von Ihnen bearbeiteten Repositories betrifft.
Wenn die Konfigurationsvariable core.untrackedCache geändert wird, wird der Untracked-Cache zum Index hinzugefügt oder daraus entfernt, wenn das nächste Mal ein Befehl den Index liest; während bei Verwendung von --[no-|force-]untracked-cache der Untracked-Cache sofort zum Index hinzugefügt oder daraus entfernt wird.
Vor 2.17 hatte der Untracked-Cache einen Fehler, bei dem das Ersetzen eines Verzeichnisses durch einen Symlink zu einem anderen Verzeichnis dazu führen konnte, dass von Git nachverfolgte Dateien fälschlicherweise als nicht nachverfolgt angezeigt wurden. Siehe den Commit "status: add a failing test showing a core.untrackedCache bug" in git.git. Eine Abhilfe dafür ist (und dies funktioniert möglicherweise auch für andere unentdeckte Fehler in der Zukunft)
$ git -c core.untrackedCache=false status
Dieser Fehler hat auch Nicht-Symlink-Fälle des Ersetzens eines Verzeichnisses durch eine Datei in Bezug auf die internen Strukturen des Untracked-Cache betroffen, aber es wurde kein Fall gemeldet, bei dem dies zu falschen "git status"-Ausgaben geführt hätte.
Es gibt auch Fälle, in denen bestehende Indizes, die von Git-Versionen vor 2.17 geschrieben wurden, auf Verzeichnisse verweisen, die nicht mehr existieren, was potenziell zu vielen Warnungen "could not open directory" bei "git status" führen kann. Dies sind neue Warnungen für bestehende Probleme, die zuvor stillschweigend verworfen wurden.
Wie bei dem oben beschriebenen Fehler ist die Lösung, einmalig einen "git status"-Lauf mit core.untrackedCache=false durchzuführen, um die verbleibenden fehlerhaften Daten zu bereinigen.
FILE SYSTEM MONITOR
Diese Funktion soll die Geschwindigkeit von Git-Operationen für Repositories mit großen Arbeitsverzeichnissen verbessern.
Sie ermöglicht Git die Zusammenarbeit mit einem Dateisystem-Monitor (siehe git-fsmonitor--daemon[1] und den Abschnitt "fsmonitor-watchman" in githooks[5]), der es ihm mitteilen kann, welche Dateien geändert wurden. Dies ermöglicht Git, das lstat()-en jeder Datei zur Suche nach geänderten Dateien zu vermeiden.
In Verbindung mit dem Untracked-Cache kann die Leistung weiter verbessert werden, indem die Kosten für das Scannen des gesamten Arbeitsverzeichnisses nach neuen Dateien vermieden werden.
Wenn Sie diese Funktion aktivieren (oder deaktivieren) möchten, ist es einfacher, die Konfigurationsvariable core.fsmonitor (siehe git-config[1]) zu verwenden, als die Option --fsmonitor für git update-index in jedem Repository, insbesondere wenn Sie dies in allen von Ihnen verwendeten Repositories tun möchten, da Sie die Konfigurationsvariable einmalig in Ihrer $HOME/.gitconfig setzen können und dies alle von Ihnen bearbeiteten Repositories betrifft.
Wenn die Konfigurationsvariable core.fsmonitor geändert wird, wird der Dateisystem-Monitor zum Index hinzugefügt oder daraus entfernt, wenn das nächste Mal ein Befehl den Index liest. Wenn --[no-]fsmonitor verwendet werden, wird der Dateisystem-Monitor sofort zum Index hinzugefügt oder daraus entfernt.
KONFIGURATION
Der Befehl berücksichtigt die Konfigurationsvariable core.filemode. Wenn Ihr Repository auf einem Dateisystem liegt, dessen ausführbare Bits unzuverlässig sind, sollte dies auf false gesetzt werden (siehe git-config[1]). Dies bewirkt, dass der Befehl Unterschiede in den im Index gespeicherten Dateimodien und den Dateimodien auf dem Dateisystem ignoriert, wenn sie sich nur auf das ausführbare Bit unterscheiden. Auf einem solchen unglücklichen Dateisystem müssen Sie möglicherweise git update-index --chmod= verwenden.
Ebenso, wenn die Konfigurationsvariable core.symlinks auf false gesetzt ist (siehe git-config[1]), werden symbolische Links als normale Dateien ausgecheckt, und dieser Befehl ändert den aufgezeichneten Dateimodus nicht von einem symbolischen Link zu einer regulären Datei.
Der Befehl berücksichtigt die Konfigurationsvariable core.ignorestat. Siehe den Abschnitt "Using "assume unchanged" bit" oben.
Der Befehl berücksichtigt auch die Konfigurationsvariable core.trustctime. Dies kann nützlich sein, wenn die Inode-Änderungszeit regelmäßig von etwas außerhalb von Git modifiziert wird (Dateisystem-Crawler und Backup-Systeme verwenden ctime, um verarbeitete Dateien zu markieren) (siehe git-config[1]).
Die Untracked-Cache-Erweiterung kann durch die Konfigurationsvariable core.untrackedCache aktiviert werden (siehe git-config[1]).
ANMERKUNGEN
Benutzer versuchen oft, die Bits "assume-unchanged" und "skip-worktree" zu verwenden, um Git mitzuteilen, dass Änderungen an Dateien ignoriert werden sollen, die nachverfolgt werden. Dies funktioniert nicht wie erwartet, da Git beim Ausführen bestimmter Operationen immer noch Arbeitsverzeichnisdateien mit dem Index vergleichen kann. Im Allgemeinen bietet Git keine Möglichkeit, Änderungen an nachverfolgten Dateien zu ignorieren, daher werden alternative Lösungen empfohlen.
Wenn beispielsweise die zu ändernde Datei eine Art Konfigurationsdatei ist, kann das Repository eine Beispielkonfigurationsdatei enthalten, die dann in den ignorierten Namen kopiert und geändert werden kann. Das Repository kann sogar ein Skript enthalten, um die Beispieldatei als Vorlage zu behandeln, sie automatisch zu modifizieren und zu kopieren.
GIT
Teil der git[1] Suite