2015-01-26 12 views
18

Sto usando git per il controllo del codice sorgente su un repository. Recentemente ha iniziato avvertendomi di quanto tempo ci vuole per enumerare i file non monitorate quando si utilizza git status:Git enumera lentamente file non tracciati inesistenti

$ git status 
On branch my_branch 
Changes not staged for commit: 
    (use "git add <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory) 

    modified: My_Project/my_source.c 


It took 3.24 seconds to enumerate untracked files. 'status -uno' 
may speed it up, but you have to be careful not to forget to add 
new files yourself (see 'git help status'). 
no changes added to commit (use "git add" and/or "git commit -a") 

Tuttavia, non ci sono file non monitorate in questo repository - ho controllato con git status -uall. Altre informazioni eventualmente rilevanti:

  • Ho notato che questo avviso appare solo quando il numero git status richiede effettivamente alcuni secondi per essere eseguito.
  • Il mio deposito è 130,6 MB al momento.
  • I miei prodotti di costruzione sono tutti out-of-tree.

Perché git impiega così tanto tempo a enumerare file non tracciati che non esistono?


Ecco alcuni rilevanti altre domande:

+5

"File non tracciati" include file ignorati da '.gitignore' e amici. La dimensione del tuo repository non ha molta importanza, dal momento che 'git status' solo' lstat() 's i tuoi file. Ciò che conta è quanti file ci sono, quanto profondamente annidato l'albero delle directory e quanto velocemente il tuo filesystem è. –

+0

Se nella tua struttura ci sono molti artefatti di costruzione, potresti prendere in considerazione l'utilizzo di build fuori dall'architettura per accelerare le cose. –

+0

@SvenMarnach Interessante. Le mie build sono già fuori dal campo - ho modificato la mia domanda per riflettere questo. Il mio progetto è grande, ma non pazzesco - la maggior parte delle fonti ha un livello profondo e ci sono 334 di questi file all'ultimo conteggio. – ravron

risposta

3

Solo per chiariscono la soluzione ha dato dall'autore nell'ultimo commento:

Ho sostituito il mio disco e da allora non ho riscontrato questo problema.

Il problema non era in git, ma invece il problema era nel computer Hardware.
Dopo la sostituzione dell'HD, il problema è stato risolto.

+1

Grazie, sciocco me per non rispondere in realtà. – ravron

2

In primo luogo, voglio riconoscere i commenti di Sven Marnach sopra che fondamentalmente mi ha dato questa soluzione.

Problema: Ho avuto questo problema, ma il mio HD (s) è/sono a posto. Ci vogliono 3-5 secondi per fare uno "stato git" su un drive SSD e 4-8 secondi su uno magnetico. È molto più veloce dopo averlo fatto un paio di volte. Vedo anche questo errore nel richiedere così tanto tempo per enumerare i file non tracciati, ma non ho alcuna modifica al commit.

Soluzione rapida: Elimina qualsiasi file nascosto dai file .gitignore.

Soluzione migliore: Interrompere la creazione nella stessa directory nel controllo del codice sorgente.

Perché: Git deve ancora passare attraverso tutti i file non tracciati, vedere se ce ne sono nuovi e quindi rimandarli con riferimento alle voci in .gitignore. Questo errore non sta dicendo che hai i file che devono essere archiviati, piuttosto che impiegano molto tempo in questi giorni per capire se c'è un file che deve essere archiviato.

Su un checkout pulito dove ci sono non ci sono file che devono essere nascosti da git ignore e un'unità SSD, l'esecuzione di "git status" richiede 0,8 secondi.

Un'ultima nota: si tratta di un progetto molto vecchio e abbiamo un file .gitignore molto grande. Ho il sospetto che la riduzione 100 voci verso il basso per una singola directory aiuterebbe troppo, ma purtroppo abbiamo alcuni file in ciascuna di queste directory di output che vengono controllati in.

2

mia soluzione era quella rimuovere percorsi di file completo in .gitignore e ignorare le directory invece ove possibile.

Solo per notare il mio gitignore era lungo 15000 righe.

Problemi correlati