Git beschleunigen: Wichtige Techniken zur Leistungsoptimierung

Beschleunigen Sie Git, indem Sie die Klonkosten senken, Git LFS sinnvoll einsetzen, veraltete Referenzen entfernen, generierte Dateien ignorieren und Sparse Checkout verwenden.

Git beschleunigen: Wichtige Techniken zur Leistungsoptimierung

Langsames Git hat normalerweise eine konkrete Ursache: zu viel Historie, zu viele nicht versionierte Dateien, große Binärobjekte, teure Dateisystem-Scans oder Netzwerklatenz. Bevor Sie Git selbst die Schuld geben, prüfen Sie, welcher Vorgang langsam ist und was er zu lesen oder herunterzuladen versucht.

Die Leistungsoptimierung von Git funktioniert am besten, wenn Sie die Lösung auf das Symptom abstimmen. Ein langsamer CI-Klon erfordert eine andere Antwort als ein langsames git status in einem riesigen Arbeitsverzeichnis.

Die Ursachen für langsame Git-Leistung verstehen

Beginnen Sie mit den häufigsten Ursachen:

  • Eine lange Historie mit vielen Dateien und Referenzen.
  • Große Binärdateien, die direkt in Git committet wurden.
  • Build-Ausgaben, Abhängigkeitsordner oder Logs, die unignoriert im Arbeitsverzeichnis liegen.
  • Viele veraltete Remote-Tracking-Branches und Tags.
  • Langsame Netzwerkverbindungen zum Remote-Repository.
  • Alte Git-Versionen, denen neuere Wartungs- und Sparse-Checkout-Verbesserungen fehlen.

Führen Sie den langsamen Befehl mit Bedacht aus. Wenn git clone langsam ist, prüfen Sie die Größe der Historie und die Netzwerkübertragung. Wenn git status langsam ist, prüfen Sie die Größe des Arbeitsverzeichnisses, ignorierte Dateien und das Dateisystemverhalten. Wenn git fetch langsam ist, prüfen Sie Remote-Referenzen, Tags und geänderte Objekte.

Klon- und Fetch-Kosten reduzieren

Für CI, Bereitstellungsjobs und schreibgeschützte Inspektionen benötigen Sie oft nicht die vollständige Historie.

Verwenden Sie einen flachen Klon:

git clone --depth <anzahl> <repository_url>

Um beispielsweise nur die letzten 10 Commits zu klonen:

git clone --depth 10 https://github.com/beispiel/repo.git

Für CI-Jobs, die nur den aktuellen Commit erstellen, ist --depth 1 oft ausreichend. Für Entwicklerarbeit ist ein vollständiger Klon normalerweise weniger überraschend, da Befehle wie tiefes git log, das Auschecken alter Tags und manche Rebases mehr Historie benötigen.

Wenn Sie bereits einen flachen Klon haben und mehr Historie benötigen, vertiefen Sie ihn:

git fetch --deepen=50 origin

Oder konvertieren Sie ihn in einen vollständigen Klon:

git fetch --unshallow origin

Für partielle Datenanforderungen unterstützen neuere Git-Versionen auch partielle Klonfilter wie --filter=blob:none, aber verwenden Sie diese nur, wenn Ihr Git-Host und Ihr Workflow sie gut unterstützen:

git clone --filter=blob:none https://github.com/beispiel/grosses-repo.git

Große Dateien aus der normalen Git-Historie heraushalten

Große Binärdateien sind einer der schnellsten Wege, Git langsam zu machen. Bilder, Videos, Archive, Design-Dateien und Modelldateien lassen sich oft nicht gut komprimieren oder differenzieren.

Verwenden Sie Git LFS für große Assets, die wirklich zum Repository gehören:

git lfs install
git lfs track "*.psd"
git lfs track "assets/*.mp4"
git add .gitattributes
git commit -m "Große Assets mit Git LFS verfolgen"

Git LFS wirkt sich auf zukünftige Commits aus, nachdem die Tracking-Regeln eingerichtet wurden. Wenn jemand bereits große Dateien in die normale Git-Historie committet hat, reicht es nicht aus, sie aus dem aktuellen Verzeichnisbaum zu entfernen. Möglicherweise ist eine koordinierte Umschreibung der Historie mit einem Tool wie git lfs migrate import oder git filter-repo erforderlich.

Für generierte Build-Artefakte ist die bessere Antwort normalerweise nicht LFS. Committen Sie sie nicht. Fügen Sie sie stattdessen zu .gitignore hinzu:

node_modules/
dist/
coverage/
*.log

Lokale Referenzen und Objekte bereinigen

Veraltete Remote-Tracking-Branches fügen Unordnung hinzu und können Befehle verlangsamen, die Referenzen auflisten oder überprüfen. Entfernen Sie sie während des Fetchens:

git fetch --prune

Löschen Sie lokale Branches, die bereits gemerged und nicht mehr benötigt werden:

git branch --merged
git branch -d alter-feature-branch

Lassen Sie Git die Wartung durchführen:

git maintenance run

Bei älteren Workflows ist git gc immer noch nützlich:

git gc

Vermeiden Sie aggressive Bereinigungsbefehle, es sei denn, Sie wissen, warum Sie sie benötigen. Das Ablaufen von Reflogs kann es beispielsweise erschweren, sich von einem fehlgeschlagenen Reset zu erholen.

git status günstiger machen

git status muss das Arbeitsverzeichnis überprüfen. Wenn Ihr Projektverzeichnis Tausende von generierten oder Abhängigkeitsdateien enthält, kann der Status laut und langsam werden.

Verwenden Sie .gitignore für Dateien, die Git nicht berücksichtigen soll. Wenn eine Datei bereits versioniert ist, verhindert .gitignore nicht, dass Git sie weiterverfolgt; Sie müssen sie zuerst aus dem Index entfernen:

git rm --cached pfad/zu/generierter-datei

Für sehr große Repositorys, in denen Sie nur einen Teil des Verzeichnisbaums benötigen, kann Sparse Checkout helfen:

git sparse-checkout init --cone
git sparse-checkout set services/api docs

Das behält nur ausgewählte Pfade in Ihrem Arbeitsverzeichnis. Es ist in Monorepos nützlich, aber Ihr Team sollte die erwarteten Sparse-Pfade dokumentieren, damit Entwickler keine Dateien übersehen, die sie benötigen.

Fetch von Integration trennen

git pull holt und integriert dann Änderungen mit Merge oder Rebase, abhängig von der Konfiguration. Wenn ein Repository groß ist oder ein Branch abgewichen ist, ist es oft klarer, zuerst zu fetchen:

git fetch origin
git log --oneline HEAD..origin/main
git merge origin/main

Das macht die Netzwerkübertragung an sich nicht kleiner. Es gibt Ihnen Kontrolle, bevor Sie Ihren Arbeitsbranch ändern.

Praktische Erkenntnisse

Verwenden Sie flache Klone für kurzlebige Jobs, Git LFS für große Assets, .gitignore für generierte Dateien, das Entfernen für veraltete Referenzen und Sparse Checkout für große Verzeichnisbäume, in denen Sie nur eine Teilmenge benötigen. Halten Sie Git aktuell, aber verwenden Sie Integritätstools wie git fsck nicht als Leistungsverbesserung, es sei denn, Sie vermuten eine Repository-Beschädigung.

Wenn Git sich langsam anfühlt, notieren Sie den genauen Befehl und wo die Zeit hingeht: Netzwerkübertragung, Objektverarbeitung oder Arbeitsverzeichnis-Scan. Dieses eine Detail weist normalerweise auf die richtige Optimierung hin.