同様のエラー メッセージが 2 つあります:
EMFILE: Too many open files ENFILE: Too many open files in system
EMFILE
を取得しているようです 、これは、個々のプロセスのファイル数を超えていることを意味します。それで、 vi
かどうかをチェックします ファイルを開くことができるかどうかは無関係です — vi
独自の別のファイル テーブルを使用します。制限を確認してください:
$ ulimit -n 1024
そのため、私のシステムでは、1 つのプロセスで開くことができるファイル数は 1024 に制限されています。上限を上げるために、システム管理者に依頼する必要はありません (頭字語 SA はわかりにくいので使用しないでください。省略しなければならない場合は、「sysadmin」を使用してください)。
strace
で Git を実行して、Git が開くファイルを確認することもできます。 .
これは、Git またはライブラリのバグである可能性があります。または、何かの古いバージョンを使用している可能性があります。または、より奇妙な何かである可能性があります。 strace
を試す 最初にどのファイルを開くかを確認し、Git がそれらのファイルを閉じるかどうかを確認します。
Hazok からの更新:
上記の推奨事項を使用した後、エラーの原因は緩いオブジェクトが多すぎることが判明しました。 git gc
のため、ゆるいオブジェクトが多すぎました 十分な頻度で実行されていませんでした。
なぜそうなったのですか?
git ドキュメントから:
<ブロック引用>リポジトリにこれより多くのルース オブジェクトがある場合、git gc --auto はそれらをパックします。一部の磁器コマンドは、このコマンドを使用して軽量のガベージ コレクションを時々実行します。 デフォルト値は 6700 です。
ここで「いくつかの磁器コマンド」には git push
が含まれています 、 git fetch
など。したがって、最大オープン ファイルが ulimit -n
に制限されている場合 <6700、あなたは最終的に git gc --auto
によってブロックされます 1 つの git リポジトリで最大 6700 個のルース オブジェクトを取得したら。
急いでいます。修正方法
システムの ulimit を調整するための十分な権限がある場合:
$ sudo ulimit -n 8192
それ以外の場合は、git gc
を無効にすることができます git config gc.auto 0
を設定することにより 、ローカル コミットをリモートにプッシュし、リポジトリを削除し、何千ものルーズ オブジェクトなしでクローンを元に戻すことができるようにします。
このようなことが再び起こらないようにするにはどうすればよいでしょうか?
git config --global gc.auto 200
を設定 、ここで 200 は、開いているファイルの最大制限よりも小さい値です。小さすぎる値を選択した場合、git gc
頻繁に実行されるため、賢明に選択してください。
gc.auto=0
を設定した場合 git gc
を実行しない限り、ルーズ オブジェクトはパックされません。 手動で。そのため、同じディレクトリに何十万ものファイルが蓄積される可能性があり、これは特に機械的なハード ドライブや Windows ユーザーにとっては問題になる可能性があります。 (以下も参照してください:ディレクトリ内のファイル数は多すぎますか? および同じ Linux ディレクトリに数百または数千のファイルがあっても (パフォーマンス的に) OK ですか?)。