Es gibt zwei ähnliche Fehlermeldungen:
EMFILE: Too many open files ENFILE: Too many open files in system
Anscheinend erhalten Sie EMFILE
, was bedeutet, dass die Anzahl der Dateien für einen einzelnen Prozess überschritten wird. Überprüfen Sie also, ob vi
Dateien öffnen kann, ist irrelevant – vi
verwendet eine eigene, separate Dateitabelle. Prüfen Sie Ihre Limits mit:
$ ulimit -n 1024
Auf meinem System gibt es also ein Limit von 1024 geöffneten Dateien in einem einzigen Prozess. Sie sollten Ihren Systemadministrator nicht fragen müssen (bitte verwenden Sie nicht das Akronym SA, es ist zu undurchsichtig; wenn Sie es abkürzen müssen, verwenden Sie „sysadmin“), um das Limit zu erhöhen.
Sie können überprüfen, welche Dateien Git öffnet, indem Sie Git unter strace
ausführen .
Dies könnte ein Fehler in Git oder in einer Bibliothek sein, oder es könnte sein, dass Sie eine alte Version von etwas verwenden, oder es könnte etwas Bizarres sein. Versuchen Sie es mit strace
zuerst sehen, welche Dateien es öffnet, und überprüfen, ob Git diese Dateien schließt.
Update von Hazok:
Nach Anwendung der obigen Empfehlungen stellt sich heraus, dass der Fehler durch zu viele lose Objekte verursacht wurde. Es gab zu viele lose Objekte, weil git gc
wurde nicht oft genug ausgeführt.
Warum ist das passiert?
Aus der Git-Dokumentation:
Wenn ungefähr mehr als diese Anzahl loser Objekte im Repository vorhanden sind, packt git gc --auto sie. Einige Porcelain-Befehle verwenden diesen Befehl, um von Zeit zu Zeit eine einfache Garbage Collection durchzuführen. Der Standardwert ist 6700.
Hier enthält "Einige Porzellanbefehle" git push
, git fetch
usw. Wenn also die maximale Anzahl geöffneter Dateien auf ulimit -n
begrenzt ist <6700, Sie werden schließlich von git gc --auto
blockiert Sobald Sie ~6700 lose Objekte in einem einzigen Git-Repo haben.
Ich habe es eilig. Wie kann ich das Problem beheben?
Wenn Sie über ausreichende Berechtigungen verfügen, um das System ulimit anzupassen:
$ sudo ulimit -n 8192
Andernfalls können Sie git gc
deaktivieren durch Setzen von git config gc.auto 0
, sodass Sie Ihre lokalen Commits auf die Remote übertragen, das Repo löschen und es ohne Tausende von losen Objekten zurückklonen können.
Wie können wir verhindern, dass so etwas noch einmal passiert?
Stellen Sie git config --global gc.auto 200
ein , wobei 200 ein Wert ist, der unter Ihrem Limit für maximal geöffnete Dateien liegt. Wenn Sie einen zu kleinen Wert ausgewählt haben, git gc
würde zu häufig laufen, also wähle weise.
Wenn Sie gc.auto=0
einstellen , werden die losen Objekte niemals gepackt, es sei denn, Sie führen git gc
aus manuell. Es könnten sich also Hunderttausende von Dateien im selben Verzeichnis ansammeln, was insbesondere für Benutzer von mechanischen Festplatten oder Windows ein Problem darstellen könnte. (Siehe auch:Wie viele Dateien in einem Verzeichnis sind zu viele? und Ist es (leistungsmäßig) in Ordnung, Hunderte oder Tausende von Dateien im selben Linux-Verzeichnis zu haben?).