Ci sono due messaggi di errore simili:
EMFILE: Too many open files ENFILE: Too many open files in system
Sembra che tu riceva EMFILE
, il che significa che il numero di file per un singolo processo è stato superato. Quindi, controllando se vi
può aprire i file è irrilevante—vi
utilizzerà la propria tabella di file separata. Controlla i tuoi limiti con:
$ ulimit -n 1024
Quindi sul mio sistema c'è un limite di 1024 file aperti in un singolo processo. Non dovresti chiedere al tuo amministratore di sistema (per favore non usare l'acronimo SA, è troppo opaco; se devi abbreviare, usa "sysadmin") per alzare il limite.
Potresti voler controllare quali file Git apre eseguendo Git sotto strace
.
Questo potrebbe essere un bug in Git o in una libreria, o potrebbe essere che stai usando una vecchia versione di qualcosa, o potrebbe essere qualcosa di più bizzarro. Prova strace
prima per vedere quali file apre e controlla se Git li chiude.
Aggiornamento da Hazok:
Dopo aver utilizzato i consigli di cui sopra, risulta che l'errore è stato causato da troppi oggetti sciolti. C'erano troppi oggetti sciolti perché git gc
non veniva eseguito abbastanza spesso.
Perché è successo?
Dalla documentazione git:
Quando ci sono approssimativamente più di questo numero di oggetti sciolti nel repository, git gc --auto li comprimerà. Alcuni comandi di Porcelain utilizzano questo comando per eseguire di tanto in tanto una raccolta dei rifiuti leggeri. Il valore predefinito è 6700.
Qui "Alcuni comandi di porcellana" include git push
, git fetch
ecc. Quindi, se il numero massimo di file aperti limita ulimit -n
<6700, alla fine verrai bloccato da git gc --auto
una volta che hai ~6700 oggetti sciolti in un singolo repository git.
Sono di fretta. Come risolverlo?
Se disponi di autorizzazioni sufficienti per regolare il sistema ulimit:
$ sudo ulimit -n 8192
Altrimenti, puoi disabilitare git gc
impostando git config gc.auto 0
, in modo da poter inviare i tuoi commit locali al remoto, eliminare il repository e clonarlo di nuovo senza migliaia di oggetti sciolti.
Come possiamo evitare che ciò accada di nuovo?
Imposta git config --global gc.auto 200
, dove 200 è un valore inferiore al limite massimo di file aperti. Se hai scelto un valore troppo piccolo, git gc
verrebbe eseguito troppo frequentemente, quindi scegli con saggezza.
Se imposti gc.auto=0
, gli oggetti sciolti non verranno mai impacchettati a meno che non si esegua git gc
manualmente. Quindi potrebbero esserci centinaia di migliaia di file accumulati nella stessa directory, il che potrebbe essere un problema, specialmente per il disco rigido meccanico o gli utenti Windows. (Vedi anche:Quanti file in una directory sono troppi? e Va bene (dal punto di vista delle prestazioni) avere centinaia o migliaia di file nella stessa directory Linux?).