15

Gitで問題が発生し、次のメッセージが表示されます。

> git fetch
error: cannot create pipe for ssh: Too many open files
fatal: unable to fork

システム管理者がファイル制限を増やしましたが、問題は修正されていません。さらに、viで新しいファイルを作成することに問題はありません。

新しいブランチをプッシュしようとすると、同様のメッセージが表示されます。

git push origin test_this_broken_gitエラー:パイプを作成できません:開いているファイルが多すぎます致命的:send-pack:サイドバンドデマルチプレクサをフォークできません

誰かがこれが起こっている理由を正確に答えることができますか?git configに最近変更を加えておらず、手動で確認しました。

4

2 に答える 2

16

2つの同様のエラーメッセージがあります。

EMFILE:開いているファイルが多すぎます
ENFILE:システムで開いているファイルが多すぎます

を取得しているようです。EMFILEこれは、個々のプロセスのファイル数を超えていることを意味します。したがって、viファイルを開くことができるかどうかを確認することは重要ではありません。<code>viは独自の個別のファイルテーブルを使用します。以下で制限を確認してください:

$ ulimit -n
1024

したがって、私のシステムでは、1つのプロセスで開くファイルは1024個に制限されています。システム管理者に制限を上げるように依頼する必要はありません(頭字語SAは使用しないでください。不透明すぎます。省略しなければならない場合は、「sysadmin」を使用してください)。

の下でGitを実行して、Gitが開くファイルを確認することをお勧めしstraceます。

これは、Gitまたはライブラリのバグである可能性があります。または、古いバージョンの何かを使用している可能性があります。あるいは、より奇妙なものである可能性があります。strace最初に開いているファイルを確認し、Gitがそれらのファイルを閉じるかどうかを確認してください。

Hazokからの更新:

上記の推奨事項を使用した後、エラーの原因は緩いオブジェクトが多すぎることが判明しました。git gc十分な頻度で実行されていなかったため、緩いオブジェクトが多すぎました。

于 2013-03-13T01:40:15.973 に答える
3

なぜこれが起こったのですか?

gitドキュメントから:

リポジトリにこれよりも多くの緩いオブジェクトがある場合、gitgc--autoはそれらをパックします。一部のPorcelainコマンドは、このコマンドを使用して、軽量のガベージコレクションを時々実行します。デフォルト値は6700です。

ここで、「一部の磁器コマンド」にはgit pushgit fetchなどが含まれます。したがって、開くファイルの最大数が6700未満の場合、1つのgitリポジトリで最大6700のルーズオブジェクトを取得ulimit -nすると、最終的にブロックされます。git gc --auto

私は急いでね。それを修正する方法は?

システムの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ディレクトリに数百または数千のファイルが含まれていても(パフォーマンス的には)問題ありませんか? )

于 2021-02-22T12:31:32.400 に答える