Der Git-Status dauert lange

85

Ich verwende gitzum Verwalten von Dateien in einem lokalen Verzeichnis auf einem Windows-Computer. Hier ist kein Netzwerk beteiligt. Ich drücke oder ziehe nicht auf einen anderen Computer. Mein Verzeichnis enthält vielleicht 100 Dateien, alle Testdateien, ziemlich klein. Wenn ich renne git status, dauert es regelmäßig 20 bis 30 Sekunden. Ist das normal? Kann ich irgendetwas tun, um es zu beschleunigen, oder einen besseren Weg, um den Status meines Repositorys zu sehen (geänderte Dateien, nicht verfolgte Dateien usw.)? Andere gitBefehle scheinen viel schneller ausgeführt zu werden.

Matt McMinn
quelle
Welche Git-Version verwendest du? Bitte fragen Sie entweder in der msysGit Google Group oder in der git-Mailingliste (git [at] vger.kernel.org, Sie müssen sich nicht anmelden) um Hilfe. Vielleicht ist dies ein Fehler in git.
Jakub Narębski

Antworten:

126

Haben Sie git gc ausprobiert ? Dies reinigt die Kruft aus dem Git-Repo.

Scott
quelle
3
Dies scheint den Trick getan zu haben. Ich bin jedoch sehr überrascht, dass das Repository nach nur wenigen Commits so viele Dinge enthält, die bereinigt werden können - danke!
Matt McMinn
4
Hehe, ich habe gerade git statusden timeBefehl ausgeführt und eine "Echtzeit" von 30.464s erhalten. Ich lief git gcdann time git statusnoch einmal und bekam eine Echtzeit von 35.409s. Ziemlich seltsam.
RyanScottLewis
14
Dies hat mich für die meisten meiner Repositories von 33 Sekunden auf weniger als 1 Sekunde behoben. Es wäre schön, wenn Git Ihnen sagen würde, dass Sie dies tun sollen, wenn Sie an diesem Punkt angelangt sind. Ich wusste nie, dass es gebraucht wurde.
XP84
Bei git statusmehrmaliger Ausführung hintereinander benötigen die nachfolgenden Läufe nur einen Bruchteil der ersten. Wenn Sie also hin und wieder laufen git status, wird erwartet, dass es sehr schnell läuft. git gcgit status
Kiewic
7

Bei einem ähnlichen Problem stellte ich fest, dass ein Git-Repo in einem Verzeichnis unterhalb meines vorhandenen Git-Repo zu einer massiven Verlangsamung führte.

Ich habe das sekundäre Git-Repo woanders hingelegt und jetzt ist die Geschwindigkeit schnell!

Sarge
quelle
Ich füge ein ähnliches Problem hinzu. Was passiert ist, ist git init in einem Unterverzeichnis. Das Problem dabei ist, dass das Unterverzeichnis irgendwie versteckt ist (Sie müssen den Git-Status im Inneren ausführen, um die Änderungen zu sehen), aber ich denke, Git versucht immer noch, sie zu berechnen. Ich ignoriere das Unterverzeichnis und jetzt ist alles in Ordnung.
mb14
6

Verwenden Sie eine Virenschutzsoftware? Vielleicht stört das die Dinge. gitist für mich unter Windows mit Repositorys von Tausenden von Dateien sehr schnell.

1800 INFORMATIONEN
quelle
1
Ja, der Arbeitgeber hat TrendMicro OfficeScan beauftragt. Ich habe den Virenscanner getötet, die gleichen Ergebnisse mit Git-Status.
Matt McMinn
1
Eine weitere Variante dieses Themas ist die On-the-Fly-Verschlüsselungssoftware wie Credant, mit der Ihre Box erheblich langsamer werden kann.
Don Branson
Das war das Problem für mich. Das getötete Kaspersky-Antivirus und der Status waren wieder <1 Sekunde.
Robin Winslow
5

Haben Sie versucht, neu zu packen? Git-Repack .

Versuchen Sie andernfalls, das Verzeichnis zu duplizieren und den Ordner .git im duplizierten Verzeichnis zu löschen. Erstellen Sie dann ein neues Git-Verzeichnis und prüfen Sie, ob es noch langsam ist.

Wenn es immer noch langsam ist, klingt es wie ein System- oder Hardwareproblem. Git beendet für mich den Status von Hunderten von Dateien in weniger als 5 Sekunden.

thedz
quelle
Das Umpacken schien zu helfen - nachdem ich es ausgeführt hatte, führte ich den Status aus und es kehrte sofort zurück. Ich habe jedoch einige Sekunden gewartet und den Status erneut ausgeführt, und es dauerte 30 Sekunden. Ich habe versucht, das Verzeichnis zu duplizieren, und habe das gleiche Problem festgestellt.
Matt McMinn
Hmm, interessant. Haben Sie ein externes Laufwerk? Oder ein USB-Stick? Versuchen Sie, das Repo dort zu kopieren, und prüfen Sie, ob es einen Unterschied gibt. Möglicherweise liegt ein Problem mit dem Laufwerk vor, auf dem es sich gerade befindet.
Thedz
Kein Unterschied auf einem USB-Laufwerk.
Matt McMinn
Das ist wirklich seltsam. Alles was ich an dieser Stelle wirklich sagen kann ist, dass ich es nicht weiß. Sie könnten versuchen, Ihr Repo zu kopieren und es auf dem Computer eines anderen zu versuchen - das sollte Ihnen zumindest sagen, ob es sich um ein lokales Problem Ihres Systems handelt.
Thedz
4

Aus irgendeinem Grund git statusist es besonders langsam, nachdem der Repository-Ordner an einen neuen Speicherort verschoben oder kopiert wurde.

Nachfolgende Läufe sind in diesem Fall normalerweise schneller.

DanJAB
quelle
1
Gibt es eine Möglichkeit, diese Langsamkeit im ersten Durchgang zu vermeiden? Ich habe git gc ausprobiert, aber es hat nicht geholfen. Es ist kein Problem, da es nur beim ersten Mal nach dem Kopieren der Dateien auftritt.
Franksands
Mir ist kein Weg bekannt, um die anfängliche Langsamkeit zu vermeiden, aber wenn es einen Befehl gäbe, der dies könnte, würde er wahrscheinlich dasselbe tun wie der ursprüngliche git statusBefehl, also würde er wahrscheinlich dieselbe Zeit in Anspruch nehmen, um ihn auszuführen.
DanJAB
4

Mein git statuswar sehr langsam (bis zu einer Minute), da sich die globale .gitignoreDatei in meinem Windows-Benutzerprofil befand, das auf einer unzugänglichen Netzwerkfreigabe gespeichert war.

git config --global core.excludesfile
zeigte so etwas wie \\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt

Aus irgendeinem Grund \\Nxxxx0war der Zugriff nicht möglich und mein Benutzerprofil wurde von einem Sicherungssystem geladen \\Nxxxxx1. Es hat einige Zeit gedauert, um das herauszufinden, da mein Benutzerprofil normalerweise durch ein Unternehmensstart-Skript an einen Laufwerksbuchstaben gebunden ist und der Zugriff auf diesen Laufwerksbuchstaben wie gewohnt funktioniert hat. Ich bin mir nicht sicher, warum die Git-Konfiguration die Netzwerkfreigabe und nicht den Laufwerksbuchstaben verwendet hat (wahrscheinlich ist ein jüngeres Ich schuld).

Nach dem Einstellen
git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt
git statuswar wieder normale Geschwindigkeit.

Arigion
quelle
3

Durch das Laufen git fsckwurde dieses Problem in der Vergangenheit für mich behoben.

Rechnung
quelle
2

Für mich war die Langsamkeit darauf zurückzuführen, dass viele nicht verfolgte Dateien (temporäre Dateien und Ausgabedateien aus Skripten) vorhanden waren. Das Ausführen git status -uno, das die nicht verfolgten Dateien ausschließt, lief viel schneller und entspricht meinen Anforderungen

MK Hunter
quelle
1

Das Problem für mich war, dass ich viele verschiedene Repositorys auf meine lokale Festplatte geklont hatte. Je mehr Repos Sie haben, desto länger dauert es, Befehle wie den Git-Status auszuführen.

Ich habe einfach viele der Repos gelöscht, die ich lokal nicht mehr benötigte, und mein Git-Status ging von 1 Minute ~ auf 5 Sekunden.

Ich kann hier keine ähnlichen Antworten sehen.

Jack Perry
quelle
1
Ich denke nicht, dass dies den Standard, den git statusSie in einem Verzeichnis ausführen, in irgendeiner Weise beeinflussen kann. Wenn Ihre Repositorys in verschiedenen Verzeichnissen ausgecheckt sind, können Sie jeweils nur git statuseines davon ausführen . Es könnte eine andere Geschichte sein, wenn sich Ihre Git-Repos überschneiden, aber das ist sowieso eine schlechte Idee.
Hubert Grzeskowiak
@ HubertGrzeskowiak kann es definitiv. Sie waren für mich überall an verschiedenen Stellen auf meiner Festplatte, aber es hat meine Ladezeiten beim Eingeben des Git-Status stark beeinflusst. Nach dem Entfernen doppelter Repositorys wurde es sofort von mehreren Minuten auf 5 Sekunden schneller.
Jack Perry
1

Ein weiterer Aspekt, der git statusverbessert wird (in Git 2.14.x / 2.15, Q4 2017), ist, wenn auch ignorierte Dateien angezeigt werden ( git status --ignored)

" git status --ignored" Wenn Sie feststellen, dass ein Verzeichnis ohne verfolgten Pfad ignoriert wird, werden weiterhin alle ignorierten Pfade im Verzeichnis aufgelistet, was nicht erforderlich ist.
Der Codepfad wurde optimiert, um diesen Overhead zu vermeiden.

Siehe Commit 5aaa7fd (18. September 2017) von Jameson Miller ( jamill) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 075bc9c , 29. September 2017)

Verbessern Sie die Leistung von git status --ignored

Verbessern Sie die Leistung der Verzeichnislistenlogik, wenn nicht leere ignorierte Verzeichnisse aufgelistet werden sollen. Um nicht leere ignorierte Verzeichnisse anzuzeigen, durchläuft die vorhandene Logik rekursiv alle Inhalte eines ignorierten Verzeichnisses.
Diese Änderung führt die Optimierung ein, um das Durchlaufen des Inhalts zu beenden, sobald die erste Datei gefunden wurde. Dies kann die Leistung von "Git-Status - signiert" in Repositorys mit einer großen Anzahl von Dateien in ignorierten Verzeichnissen erheblich verbessern.

Ein Beispiel für den Leistungsunterschied in einem Beispiel-Repository mit 196.000 Dateien in 400 ignorierten Verzeichnissen:

| Command                    |  Time (s) |
| -------------------------- | --------- |
| git status                 |   1.2     |
| git status --ignored (old) |   3.9     |
| git status --ignored (new) |   1.4     |

Weitere Verbesserungen (eingestellt in Git 2.17, Q2 2018) finden Sie in dieser Antwort .

VonC
quelle
Völlig zufälliges Beispiel hier: node_moduleskönnte von dieser Leistungsänderung betroffen sein. Nur vielleicht.
Seth Battin
1

Ältere Versionen von Git haben ein Leistungsproblem mit dem Git-Status. Weitere Informationen finden Sie unter Möglichkeiten zur Verbesserung der Git-Status-Leistung .

Git 2.13 hat 1 Fix und 2.17 mehr. Ich bin von 2.7 auf 2.23 umgezogen und es hat den langsamen Status behoben. Für 2.24 ist bald eine weitere Verbesserung geplant.

Brett
quelle
0

In meinem Fall wurde die Langsamkeit dadurch verursacht, dass Sie git statusals anderer Benutzer als der Eigentümer der Dateien im Projekt ausgeführt wurden.

Obwohl dies nicht in allen Fällen der Fall ist, kann ein einfacher chownBenutzer für Ihren aktuellen Benutzer den Trick ausführen.

Zar Pino
quelle
-13

Beginnen Sie mit einem neuen Klon Ihrer Kasse.

git clone myrepo mynewrepo

und dann git status in mynewrepo.

Alternativ und wenn Sie mutiger sind, entfernen Sie den Müll von Ihrer vorhandenen Kasse.

git clean -dfx

Dadurch wird vermieden, dass Git einen (möglicherweise großen) Satz ignorierter oder nicht eingecheckter Dateien scannen muss.

Alex Brown
quelle
Ich denke nicht, dass das Löschen all Ihrer ignorierten Dateien (was Git Clean tut) helfen würde, es ignoriert sie bereits. Wenn Sie git clean ausführen, werden wahrscheinlich alle Ihre Konfigurationsdateien usw. usw. gelöscht. Dieser Befehl kann nicht rückgängig gemacht werden. Das erneute Klonen (zuerst das alte Repository speichern, falls Sie es benötigen) ist weitaus besser als das Ausführen von git clean und hat den gleichen Effekt.
XP84
5
Ich muss dieser Antwort nicht zustimmen. Wenn Sie git clean -dfx ausführen, kann dies zu Problemen führen.
Marcel Valdez Orozco