Ada dua pesan kesalahan serupa:
EMFILE: Too many open files ENFILE: Too many open files in system
Sepertinya Anda mendapatkan EMFILE
, yang berarti bahwa jumlah file untuk setiap proses terlampaui. Jadi, memeriksa apakah vi
dapat membuka file tidak relevan—vi
akan menggunakan tabel filenya sendiri yang terpisah. Periksa batas Anda dengan:
$ ulimit -n 1024
Jadi di sistem saya, ada batas 1024 file terbuka dalam satu proses. Anda tidak perlu bertanya kepada administrator sistem Anda (jangan gunakan akronim SA, terlalu buram; jika Anda harus menyingkat, gunakan "sysadmin") untuk menaikkan batas.
Anda mungkin ingin memeriksa file mana yang dibuka Git dengan menjalankan Git di bawah strace
.
Ini bisa jadi bug di Git atau di perpustakaan, atau bisa jadi Anda menggunakan versi lama dari sesuatu, atau bisa juga sesuatu yang lebih aneh. Coba strace
pertama untuk melihat file mana yang dibuka, dan periksa apakah Git menutup file tersebut.
Pembaruan dari Hazok:
Setelah menggunakan rekomendasi di atas, ternyata error tersebut disebabkan karena terlalu banyak objek yang lepas. Ada terlalu banyak objek lepas karena git gc
tidak cukup sering dijalankan.
Mengapa ini terjadi?
Dari dokumentasi git:
Ketika ada lebih dari ini banyak objek lepas di repositori, git gc --auto akan mengemasnya. Beberapa perintah Porselen menggunakan perintah ini untuk melakukan pengumpulan sampah ringan dari waktu ke waktu. Nilai defaultnya adalah 6700.
Di sini "Beberapa perintah Porselen" menyertakan git push
, git fetch
dll. Jadi jika file terbuka maksimal membatasi ulimit -n
<6700, Anda akhirnya akan diblokir oleh git gc --auto
setelah Anda mendapatkan ~6700 objek lepas dalam satu repo git.
Saya sedang terburu-buru. Bagaimana cara memperbaikinya?
Jika Anda memiliki izin yang memadai untuk menyesuaikan ulimit sistem:
$ sudo ulimit -n 8192
Jika tidak, Anda dapat menonaktifkan git gc
dengan mengatur git config gc.auto 0
, sehingga Anda dapat mendorong komit lokal ke jarak jauh, menghapus repo, dan menggandakannya kembali tanpa ribuan objek lepas.
Bagaimana kami dapat mencegah hal ini terjadi lagi?
Tetapkan git config --global gc.auto 200
, di mana 200 adalah nilai yang kurang dari batas maksimum file terbuka Anda. Jika Anda memilih nilai yang terlalu kecil, git gc
akan berjalan terlalu sering, jadi pilihlah dengan bijak.
Jika Anda menyetel gc.auto=0
, objek lepas tidak akan pernah dikemas kecuali Anda menjalankan git gc
secara manual. Jadi mungkin ada ratusan ribu file yang terkumpul di direktori yang sama, yang mungkin menjadi masalah, terutama untuk hard drive mekanis atau pengguna Windows. (Lihat juga:Berapa banyak file dalam direktori yang terlalu banyak? dan Bolehkah (berdasarkan kinerja) memiliki ratusan atau ribuan file dalam direktori Linux yang sama?).