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.


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

Odpowiedzi:


128

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


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!


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.


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.


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.


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.



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


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.


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ź .


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.


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ę.


-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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.