Lo stato di Git richiede molto tempo per essere completato


85

Sto usando gitper gestire i file in una directory locale su una macchina Windows - nessuna rete è coinvolta qui, non sto spingendo o tirando da / verso un'altra macchina. La mia directory contiene forse 100 file, tutti i file di prova, piuttosto piccoli. Quando corro git status, ci vogliono regolarmente 20-30 secondi per completarsi. È normale? C'è qualcosa che posso fare per velocizzarlo o un modo migliore per vedere qual è lo stato del mio repository (file modificati, file non tracciati, ecc.)? Altri gitcomandi sembrano essere completati molto più velocemente.


Quale versione di git stai usando? Per favore considera la possibilità di chiedere aiuto su msysGit Google Group o su git mailing list (git [at] vger.kernel.org, non è necessario iscriversi), forse questo è un bug in git.
Jakub Narębski

Risposte:


129

Hai provato git gc ? Questo pulisce cruft dal repository git.


3
Questo sembra aver risolto il problema. Sono però molto sorpreso che dopo solo un paio di commit il repository abbia così tante cose che possono essere ripulite - grazie!
Matt McMinn,

4
Hehe, ho appena eseguito il comando git statusutilizzando il timecomando e ho ottenuto un tempo "reale" di 30.464s. Allora ho fatto funzionare git gcallora time git statusuna volta di più e ottenuto un tempo reale di 35.409s. Piuttosto strano.
RyanScottLewis

14
Questo mi ha risolto da 33 secondi a meno di 1 secondo per la maggior parte dei miei repository. Sarebbe bello se Git ti dicesse di farlo quando inizi ad arrivare a quel punto. Non ho mai saputo che fosse necessario.
XP84

Quando si esegue git statuspiù volte di seguito, le corse successive richiedono solo una frazione della prima. Quindi, se stai correndo git status, allora git gce poi di git statusnuovo, ci si aspetta che funzioni molto velocemente.
kiewic

7

In un problema simile ho scoperto che avere un repository git in una directory sotto il mio repository git esistente ha causato un enorme rallentamento.

Ho spostato il repository git secondario da qualche altra parte e ora la velocità è veloce!


Aggiungo problema simile. Quello che è successo è che git init in una sottodirectory. Il problema è che subdir è un po 'nascosto (devi fare git status all'interno per vedere i cambiamenti) ma immagino che git stia ancora cercando di calcolarli. Ignoro la sottodirectory e ora va tutto bene.
mb14

6

Stai usando un qualche tipo di software di protezione antivirus? Forse questo sta interferendo con le cose. gitè molto veloce per me su Windows con archivi di migliaia di file.


1
Sì, il datore di lavoro ha incaricato TrendMicro OfficeScan. Ho ucciso lo scanner antivirus, gli stessi risultati con git status.
Matt McMinn

1
Un'altra variante di questo tema è il software di crittografia al volo come Credant, che può rendere la tua scatola notevolmente più lenta.
Don Branson

Questo era il problema per me. L'antivirus Kaspersky ucciso e lo stato è tornato a <1 secondo.
Robin Winslow

5

Hai provato a reimballare? git-repack .

Altrimenti, prova a duplicare la directory ed eliminare la cartella .git nella directory duplicata. Quindi crea una nuova directory git e verifica se è ancora lento.

Se è ancora lento, sembra un problema di sistema o hardware. Git termina lo stato su centinaia di file per me in meno di 5 secondi.


repack sembrava aiutare: dopo averlo eseguito, ho eseguito lo stato ed è tornato immediatamente. Tuttavia, ho aspettato alcuni secondi e ho eseguito di nuovo lo stato e ci sono voluti 30 secondi. Ho provato a duplicare la directory e ho riscontrato lo stesso problema.
Matt McMinn

Hmm, interessante. Hai un drive esterno? O una chiavetta USB? Prova a copiare il repo laggiù e vedi se c'è qualche differenza. È possibile che ci sia un problema con l'unità su cui si trova attualmente.
thedz

Nessuna differenza su un'unità USB.
Matt McMinn

È davvero strano. Tutto quello che posso davvero dire a questo punto è che non lo so. Potresti provare a copiare il tuo repository e provarlo sul computer di qualcun altro - questo dovrebbe, almeno, dirti se si tratta di un problema locale nel tuo sistema.
thedz

4

Per qualche motivo git statusè particolarmente lento dopo aver spostato o copiato la cartella del repository in una nuova posizione.

Le esecuzioni successive sono generalmente più veloci in questo caso.


1
C'è un modo per evitare questa lentezza nella prima manche? Ho provato git gc, ma non è stato d'aiuto, non è un problema dato che si verifica solo la prima volta dopo aver copiato i file.
franksands

Non sono a conoscenza di un modo per evitare la lentezza iniziale, ma se ci fosse un comando in grado di farlo, probabilmente farebbe la stessa cosa del git statuscomando iniziale , quindi probabilmente impiegherebbe lo stesso tempo per il completamento.
DanJAB

4

Il mio git statusera molto lento (fino a un minuto), perché il .gitignorefile globale si trovava nel mio profilo utente di Windows, che era archiviato in una condivisione di rete inaccessibile.

git config --global core.excludesfile
ha mostrato qualcosa di simile \\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt

Per qualche motivo \\Nxxxx0era inaccessibile e il mio profilo utente è stato caricato da un sistema di backup\\Nxxxxx1 . Ci è voluto del tempo per capirlo, perché di solito il mio profilo utente è associato a una lettera di unità da uno script di avvio aziendale e l'accesso a quella lettera di unità funzionava normalmente. Non sono sicuro del motivo per cui git-config ha utilizzato la condivisione di rete e non la lettera di unità (probabilmente la colpa è di un me più giovane)

Dopo l'impostazione
git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt
git statusè tornata alla velocità normale.


3

La corsa mi git fsckha risolto questo problema in passato.


3

Per me, la lentezza era dovuta alla presenza di molti file non tracciati (file temporanei e di output da script). In esecuzione git status -uno, che esclude i file non tracciati, è stato eseguito molto più velocemente e soddisfa i miei requisiti


1

Il problema per me era che avevo molti repository diversi clonati sul mio disco rigido locale, più repository hai più tempo ci vorrà per eseguire comandi come git status.

Ho semplicemente cancellato molti dei repository di cui non avevo più bisogno localmente e il mio stato git è passato da 1 minuto ~ a 5 secondi.

Non riesco a vedere nessuna risposta simile a questa qui.


1
Non penso che questo possa influenzare git statusin alcun modo lo standard eseguito in una directory. Se i tuoi repository vengono estratti in directory diverse, puoi eseguirne solo git statusuno alla volta. Potrebbe essere una storia diversa se i tuoi repository git si sovrappongono, ma è comunque una cattiva idea.
Hubert Grzeskowiak

@ HubertGrzeskowiak sicuramente può. Per me erano ovunque in posti diversi sul mio disco rigido, ma ha influenzato notevolmente i miei tempi di caricamento durante la digitazione di git status. Dopo aver rimosso i repository duplicati, è diventato immediatamente più veloce da più minuti a 5 secondi.
Jack Perry

1

Un altro aspetto del git statusquale sarà migliorato (in Git 2.14.x / 2.15, Q4 2017) è quando mostra anche i file ignorati ( git status --ignored)

" git status --ignored", quando nota che una directory senza alcun percorso tracciato viene ignorata, enumera comunque tutti i percorsi ignorati nella directory, il che non è necessario.
Il codepath è stato ottimizzato per evitare questo sovraccarico.

Vedi commit 5aaa7fd (18 settembre 2017) di Jameson Miller ( jamill) .
(Fuso da Junio ​​C Hamano - gitster- nel commit 075bc9c , 29 settembre 2017)

Migliora le prestazioni di git status --ignored

Migliora le prestazioni della logica dell'elenco delle directory quando si desidera elencare directory ignorate non vuote. Per mostrare directory ignorate non vuote, la logica esistente itererà ricorsivamente attraverso tutti i contenuti di una directory ignorata.
Questa modifica introduce l'ottimizzazione per interrompere l'iterazione del contenuto una volta trovato il primo file. Ciò può avere un miglioramento significativo nelle prestazioni di 'git status --ignored' nei repository con un gran numero di file in directory ignorate.

Per un esempio della differenza di prestazioni su un repository di esempio con 196.000 file in 400 directory ignorate:

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

Per ulteriori miglioramenti (impostati in Git 2.17, Q2 2018), vedi questa risposta .


Esempio totalmente casuale qui: node_modulespotrebbe essere influenzato da questo cambiamento di prestazioni. Solo forse.
Seth Battin

1

Le versioni precedenti di git presentano un problema di prestazioni con git status: vedi Modi per migliorare le prestazioni di git status per maggiori informazioni.

git 2.13 ha 1 correzione e 2.17 in più. sono passato da 2.7 a 2.23 e ha risolto lo stato lento. Presto è previsto un altro miglioramento per 2.24.


0

Nel mio caso, la lentezza è stata causata dall'esecuzione git statuscome utente diverso dal proprietario dei file nel progetto.

Sebbene non sia applicabile in tutti i casi, un semplice chownper il tuo attuale utente può fare il trucco.


-13

Prova a iniziare con un nuovo clone del tuo checkout.

git clone myrepo mynewrepo

e poi fai git status in mynewrepo.

In alternativa, e se sei più coraggioso, pulisci la spazzatura dalla tua cassa esistente.

git clean -dfx

Ciò evita che git debba scansionare alcuni (forse grandi) set di file ignorati o non archiviati.


Non penso che eliminare tutti i tuoi file ignorati (cosa fa git clean) sarebbe d'aiuto, li sta già ignorando. Più probabilmente l'esecuzione di git clean eliminerebbe tutti i file di configurazione, ecc. Ecc. E questo comando non è annullabile. Ri-clonare (prima salvare il vecchio repository nel caso in cui ne hai bisogno) è molto meglio che eseguire git clean e ha lo stesso effetto.
XP84

5
Non sono d'accordo con questa risposta, l'esecuzione di git clean -dfx potrebbe rompere le cose.
Marcel Valdez Orozco
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.