Kopieren Sie eine 200 MB große Datei, und sie fliegt. Führen Sie git status im selben Verzeichnis aus, und das Warten dauert lange genug, um innerlich woanders zu sein. Beide Beobachtungen widersprechen sich nicht, denn Bulk-Transfer misst Durchsatz, während Git misst, wie viele kleine Dateisystemfragen es pro Sekunde stellen kann, und ein eingehängter entfernter Baum macht aus jeder Frage einen Roundtrip. Am VPN zu drehen behebt keine falsch geformte Last.

Warum status der falsche Maßstab ist

Git muss über viele Dateien Bescheid wissen: welche geändert, welche unversioniert sind und ob zwischengespeicherte Indexdaten noch zum Inhalt auf der Platte passen. Über SSHFS kann jede dieser Feststellungen eine Netzwerkoperation sein. Die Arbeitseinheit ist hier die Dateizahl, nicht die Megabyte.

Deshalb ist der erste status nach einem Klon langsam, und deshalb können spätere in einem Baum voller Build-Ausgaben noch langsamer sein. Das Scannen unversionierter Dateien läuft durch Verzeichnisse, die Sie vielleicht nicht interessieren, und jeder Schritt ist eine weitere Anfrage über die Leitung. Auf einem Pfad mit 40 ms werden aus ein paar tausend Einträgen ein paar tausend Roundtrips. Es braucht keinen Paketmitschnitt, um diese Arithmetik zu bestätigen.

Ein Download-Benchmark sagt Ihnen, dass die Leitung in Ordnung ist; er sagt nichts darüber, ob tausend kleine Lesevorgänge heute Nachmittag fertig werden.

Verlege den Arbeitsbaum, nicht die Stellschrauben

Ein lokaler Klon bringt Arbeitsbaum, Index und Git-Operationen auf dieselbe Maschine. Ein Pull wird zu einem sichtbaren Netzwerkschritt, statt dass jede Dateiprüfung einer wird.

Das passt, wann immer der Entwickler die benötigte Quelle lokal halten kann, und das ist meistens der Fall. Es schärft auch die Grenze zwischen Commit und Deployment, weil das Bearbeiten einer lokalen Datei nicht mehr versehentlich einen laufenden entfernten Dienst verändert; die Änderung muss gepusht und ausgerollt werden wie alles andere. Der Preis ist, dass der Code an zwei Stellen existiert, also entscheiden Sie, welche Kopie maßgeblich ist und wie ein Hotfix auf dem Server zurück ins Repository kommt. Dieses Gespräch ist billiger als ein status-Befehl, den niemand ausführen will.

Wenn der Arbeitsbereich entfernt bleiben muss, führen Sie Git dort aus

Manchmal lässt sich der Arbeitsbereich nicht verschieben: Der Build braucht diese Umgebung, die Daten sind zu groß, oder die Richtlinie hält die Quelle auf dem Host. Dann führen Sie Git und die relevanten Entwicklungswerkzeuge neben den Dateien aus, über eine freigegebene Remote-Shell oder eine Remote-Development-Umgebung. Der Editor kann auf dem Laptop bleiben, während sein Backend neben dem Arbeitsbaum arbeitet.

Teure Operationen geschehen dann lokal auf dem entfernten Host, und das Netz trägt Editorverkehr statt tausender stat-Aufrufe. Es ist dieselbe Lösung wie ein lokaler Klon, ausgedrückt als Deployment-Entscheidung statt als Migration.

Sync ist ein Workflow mit Eigentümern, kein Cache

Ein synchronisierter Arbeitsbereich kann wiederholte entfernte Lesezugriffe verringern, aber er ist kein transparenter Cache. Er braucht einen Eigentümer für jede Änderung, eine Regel für Konflikte und eine Einigung über generierte Dateien, die beide Seiten für ihre halten. Ohne diese Regeln erzeugt die Einrichtung Uneinigkeit statt Bequemlichkeit.

Ein Zweiweg-Synchronisierer ohne sie erzeugt ein anderes Problem als das gelöste, meist einen Merge, den niemand zuordnen kann. Vermeiden Sie zwei Git-Prozesse auf einem gemeinsamen Arbeitsbaum, wenn Sie nicht verstehen, wie sie sich abstimmen.

Dann tunen, und SSH vernünftig halten

Wenn die Einrichtung stimmt, ändern zwei Einstellungen, nach wie vielen Dateien Git fragen muss: status.showUntrackedFiles und der Unversioniert-Cache hinter core.untrackedCache. Keine ändert, was jede Frage über 40 ms kostet; sie ändern nur, wie viele Fragen es gibt. Drehen Sie erst an einer Schraube, wenn die Roundtrips lokal sind.

Messen Sie die Zeit des Befehls, der Sie ärgert, statt aus einem Benchmark zu schließen, der eine große Datei kopiert, und lassen Sie die unterstützte SSH-Verschlüsselung in Ruhe. Eine veraltete Chiffre verkürzt keinen Roundtrip; sie fügt ein zweites Problem hinzu, das das erste überlebt. Die Git-status-Referenz ist eine Lektüre wert, denn der Befehl leistet weit mehr, als sein Name vermuten lässt.

Ähnliche Artikel