Ukończenie stanu Git zajmuje dużo czasu

85

Używam gitdo zarządzania plikami w katalogu lokalnym na komputerze z systemem Windows - nie jest tu zaangażowana żadna sieć, nie pcham ani nie ściągam do / z innego komputera. Mój katalog zawiera może 100 plików, wszystkie pliki testowe, całkiem małe. Kiedy biegam git status, ukończenie tego regularnie zajmuje 20-30 sekund. Czy to normalne? Czy jest coś, co mogę zrobić, aby to przyspieszyć, lub lepszy sposób, aby sprawdzić, jaki jest stan mojego repozytorium (zmienione pliki, nieśledzone pliki itp.)? gitWydaje się, że inne polecenia działają znacznie szybciej.

Matt McMinn
źródło
Której wersji git używasz? Proszę rozważyć poproszenie o pomoc na msysGit Google Group lub na liście mailingowej git (git [at] vger.kernel.org, nie musisz się subskrybować), być może jest to błąd w git.
Jakub Narębski
Możliwy duplikat sposobów poprawy wydajności statusu gita
dCSeven

Odpowiedzi:

128

Czy próbowałeś git gc ? To usuwa skorupę z repozytorium git.

Scott
źródło
3
Wydaje się, że to załatwiło sprawę. Jestem jednak bardzo zaskoczony, że po zaledwie kilku zatwierdzeniach repozytorium będzie miało tyle rzeczy, które można wyczyścić - dzięki!
Matt McMinn
4
Hehe, ja po prostu prowadził git statuspomocą timepolecenia i dostał „prawdziwy” czas 30.464s. Potem pobiegł git gcpotem time git statusjeszcze raz i mam czasie rzeczywistym 35.409s. Dość dziwne.
RyanScottLewis
14
To naprawiło mnie z 33 sekund do mniej niż 1 sekundy dla większości moich repozytoriów. Byłoby miło, gdyby Git powiedział ci, żebyś to zrobił, gdy zaczniesz dochodzić do tego punktu. Nigdy nie wiedziałem, że to potrzebne.
XP84
Przy wykonywaniu git statuswielu razy z rzędu kolejne przebiegi zajmują tylko ułamek pierwszego. Tak więc, jeśli biegasz git status, git gca potem git statusznowu, oczekuje się, że będzie działać bardzo szybko.
kiewic
7

W podobnym przypadku stwierdziłem, że posiadanie repozytorium git w katalogu poniżej mojego istniejącego repozytorium git spowodowało ogromne spowolnienie.

Przeniosłem drugie repozytorium git w inne miejsce i teraz szybkość jest duża!

Sierż
źródło
Dodam podobny problem. To, co się stało, zostało wykonane git init w podkatalogu. Problem polega na tym, że subdir jest trochę ukryty (musisz sprawdzić status git w środku, aby zobaczyć zmiany), ale wydaje mi się, że git nadal próbuje je obliczyć. Ignoruję podkatalog i teraz wszystko jest w porządku.
mb14
6

Czy używasz jakiegoś oprogramowania antywirusowego? Może to przeszkadza. gitjest dla mnie bardzo szybki w systemie Windows z repozytoriami tysięcy plików.

1800 INFORMACJE
źródło
1
Tak, zlecenie TrendMicro OfficeScan przez pracodawcę. Zabiłem skaner antywirusowy, te same wyniki ze statusem git.
Matt McMinn
1
Innym wariantem tego motywu jest oprogramowanie szyfrujące w locie, takie jak Credant, które może znacznie spowolnić twoje pudełko.
Don Branson
To był dla mnie problem. Zabity program antywirusowy Kaspersky, a stan powrócił do <1 sekundy.
Robin Winslow,
5

Czy próbowałeś przepakować? git-repack .

W przeciwnym razie spróbuj skopiować katalog i usunąć folder .git w zduplikowanym katalogu. Następnie utwórz nowy katalog git i sprawdź, czy nadal działa wolno.

Jeśli nadal działa wolno, oznacza to problem z systemem lub sprzętem. Git kończy status setek plików w mniej niż 5 sekund.

thedz
źródło
wydawało się, że pomogło przepakowanie - po uruchomieniu sprawdziłem status i natychmiast wrócił. Jednak odczekałem kilka sekund i ponownie sprawdziłem status, co zajęło 30 sekund. Próbowałem powielić katalog i napotkałem ten sam problem.
Matt McMinn
Hmm interesujące. Czy masz dysk zewnętrzny? Albo pendrive? Spróbuj skopiować tam repozytorium i zobacz, czy jest jakaś różnica. Możliwe, że wystąpił problem z dyskiem, na którym obecnie się znajduje.
thedz
Bez różnicy w napędzie USB.
Matt McMinn
To naprawdę dziwne. W tym momencie mogę tylko powiedzieć, że nie wiem. Możesz spróbować skopiować swoje repozytorium i wypróbować je na komputerze innej osoby - to przynajmniej powinno ci powiedzieć, czy jest to problem lokalny w twoim systemie.
thedz
4

Z jakiegoś powodu git statusjest szczególnie powolny po przeniesieniu lub skopiowaniu folderu repozytorium do nowej lokalizacji.

W takim przypadku kolejne przebiegi są zwykle szybsze.

DanJAB
źródło
1
Czy jest sposób, aby uniknąć tej powolności w pierwszym uruchomieniu? Próbowałem git gc, ale to nie pomogło, to nie jest problem, ponieważ dzieje się to tylko za pierwszym razem po skopiowaniu plików.
franksands
Nie znam sposobu na uniknięcie początkowego spowolnienia, ale gdyby istniało jakieś polecenie, które mogłoby to zrobić, prawdopodobnie robiłoby to samo, co git statuspolecenie początkowe , więc wykonanie prawdopodobnie zajęłoby tyle samo czasu.
DanJAB
4

Mój git statusbył bardzo powolny (do jednej minuty), ponieważ .gitignoreplik globalny znajdował się w moim profilu użytkownika systemu Windows, który był przechowywany w niedostępnym udziale sieciowym.

git config --global core.excludesfile
pokazał coś takiego \\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt

Z jakiegoś powodu \\Nxxxx0był niedostępny, a mój profil użytkownika został załadowany z systemu zapasowego \\Nxxxxx1. Zrozumienie tego zajęło trochę czasu, ponieważ zwykle mój profil użytkownika jest powiązany z literą dysku przez skrypt uruchamiania przedsiębiorstwa, a dostęp do tej litery dysku działał normalnie. Nie jestem pewien, dlaczego git-config użył udziału sieciowego, a nie litery dysku (prawdopodobnie winę ponosi młodszy ja)

Po ustawieniu
git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt
git statuswrócił do normalnej prędkości.

Arigion
źródło
3

W git fsckprzeszłości bieganie rozwiązało ten problem.

Rachunek
źródło
3

Dla mnie powolność wynikała z posiadania wielu nieśledzonych plików (plików tymczasowych i wyjściowych ze skryptów). Bieganie git status -uno, które wyklucza nieśledzone pliki, działa znacznie szybciej i spełnia moje wymagania

MK Hunter
źródło
1

Problem polegał na tym, że miałem wiele różnych repozytoriów sklonowanych na moim lokalnym dysku twardym, im więcej masz repozytoriów, tym dłużej potrwa uruchamianie poleceń, takich jak status git.

Po prostu usunąłem wiele repozytoriów, których już nie potrzebowałem lokalnie, a mój status git zmienił się z 1 minuty ~ do 5 sekund.

Nie widzę tutaj odpowiedzi podobnych do tej.

Jack Perry
źródło
1
Nie sądzę, aby miało to git statusjakikolwiek wpływ na standard, który uruchamiasz w jednym katalogu. Jeśli twoje repozytoria są wyewidencjonowane do różnych katalogów, możesz uruchomić tylko git statusdla jednego z nich na raz. To może być inna historia, jeśli twoje repozytoria git pokrywają się, ale i tak jest to zły pomysł.
Hubert Grzeskowiak
@HubertGrzeskowiak zdecydowanie tak. Były one wszędzie w różnych miejscach na moim dysku twardym, ale znacznie wpłynęło to na mój czas ładowania podczas wpisywania statusu git. Po usunięciu zduplikowanych repozytoriów od razu przyspieszyło od kilku minut do 5 sekund.
Jack Perry,
1

Innym aspektem, git statusktóry zostanie ulepszony (w Git 2.14.x / 2.15, Q4 2017) jest pokazanie również ignorowanych plików ( git status --ignored)

" git status --ignored", zauważając, że katalog bez żadnej śledzonej ścieżki jest ignorowany, nadal wyliczał wszystkie ignorowane ścieżki w katalogu, co jest niepotrzebne.
Ścieżka kodowa została zoptymalizowana, aby uniknąć tego narzutu.

Zobacz commit 5aaa7fd (18 września 2017) autorstwa Jamesona Millera ( jamill) .
(Scalone przez Junio ​​C Hamano - gitster- w zatwierdzeniu 075bc9c , 29 września 2017 r.)

Popraw wydajność git status --ignored

Popraw wydajność logiki wyświetlania katalogów, gdy chce ona wyświetlić niepuste ignorowane katalogi. Aby wyświetlić niepuste ignorowane katalogi, istniejąca logika będzie rekurencyjnie iterować po całej zawartości ignorowanego katalogu.
Ta zmiana wprowadza optymalizację, aby zatrzymać iterację po zawartości po znalezieniu pierwszego pliku. Może to znacznie poprawić wydajność „git status --ignored” w repozytoriach z dużą liczbą plików w ignorowanych katalogach.

Przykład różnicy wydajności w przykładowym repozytorium z 196 000 plików w 400 zignorowanych katalogach:

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

Aby uzyskać więcej ulepszeń (ustawionych w Git 2.17, Q2 2018), zobacz tę odpowiedź .

VonC
źródło
Całkowicie losowy przykład tutaj: node_modulesmoże mieć wpływ ta zmiana perf. Tylko może.
Seth Battin
1

Starsze wersje git mają problem z wydajnością ze statusem git - zobacz Sposoby poprawy wydajności statusu git, aby uzyskać więcej informacji.

git 2.13 ma 1 poprawkę i 2,17 więcej. przeniosłem się z 2.7 do 2.23 i rozwiązałem problem z wolnym stanem. Wkrótce planowana jest kolejna poprawa w wersji 2.24.

Brett
źródło
0

W moim przypadku powolność była spowodowana działaniem git statusjako inny użytkownik niż właściciel plików w projekcie.

Chociaż nie ma to zastosowania we wszystkich przypadkach, prosty chowndla bieżącego użytkownika może załatwić sprawę.

Czar Pino
źródło
-13

Spróbuj zacząć od nowego klonu swojej kasy.

git clone myrepo mynewrepo

a następnie uzyskaj status git w mynewrepo.

Alternatywnie, jeśli jesteś odważniejszy, wyczyść śmieci z istniejącej kasy.

git clean -dfx

Dzięki temu git nie musi skanować niektórych (prawdopodobnie dużych) zestawów ignorowanych lub niezarejestrowanych plików.

Alex Brown
źródło
Nie sądzę, aby usunięcie wszystkich zignorowanych plików (co robi git clean) pomogłoby, już je ignoruje. Bardziej prawdopodobne jest, że uruchomienie git clean spowodowałoby usunięcie wszystkich plików konfiguracyjnych, itp. Itd. Tego polecenia nie można cofnąć. Ponowne klonowanie (najpierw zapisanie starego repozytorium na wypadek, gdybyś go potrzebował) jest znacznie lepsze niż uruchomienie git clean i daje ten sam efekt.
XP84
5
Muszę się nie zgodzić z tą odpowiedzią, uruchomienie git clean -dfx może zepsuć sprawę.
Marcel Valdez Orozco