Hay dos mensajes de error similares:
EMFILE: Too many open files ENFILE: Too many open files in system
Parece que obtienes EMFILE
, lo que significa que se está excediendo el número de archivos para un proceso individual. Entonces, verificando si vi
puede abrir archivos es irrelevante—vi
utilizará su propia tabla de archivos separada. Comprueba tus límites con:
$ ulimit -n 1024
Entonces, en mi sistema, hay un límite de 1024 archivos abiertos en un solo proceso. No debería necesitar preguntarle al administrador del sistema (no use el acrónimo SA, es demasiado opaco; si debe abreviar, use "sysadmin") para aumentar el límite.
Es posible que desee verificar qué archivos abre Git ejecutando Git en strace
.
Esto podría ser un error en Git o en una biblioteca, o podría ser que esté usando una versión anterior de algo, o podría ser algo más extraño. Prueba strace
primero para ver qué archivos abre y verificar si Git cierra esos archivos.
Actualización de Hazok:
Después de usar las recomendaciones anteriores, resulta que el error fue causado por demasiados objetos sueltos. Había demasiados objetos sueltos porque git gc
no se ejecutaba con la frecuencia suficiente.
¿Por qué sucedió esto?
De la documentación de git:
Cuando haya aproximadamente más objetos sueltos en el repositorio, git gc --auto los empaquetará. Algunos comandos de Porcelain usan este comando para realizar una recolección de basura ligera de vez en cuando. El valor predeterminado es 6700.
Aquí "Algunos comandos de porcelana" incluye git push
, git fetch
etc. Entonces, si el límite máximo de archivos abiertos es ulimit -n
<6700, eventualmente serás bloqueado por git gc --auto
una vez que obtuviste ~6700 objetos sueltos en un solo repositorio de git.
Tengo prisa. ¿Cómo solucionarlo?
Si tiene permisos suficientes para ajustar el ulimit del sistema:
$ sudo ulimit -n 8192
De lo contrario, puede deshabilitar git gc
configurando git config gc.auto 0
, para que pueda enviar sus confirmaciones locales al control remoto, eliminar el repositorio y volver a clonarlo sin miles de objetos sueltos.
¿Cómo podemos evitar que esto vuelva a suceder?
Establecer git config --global gc.auto 200
, donde 200 es un valor inferior al límite máximo de archivos abiertos. Si eligió un valor demasiado pequeño, git gc
se ejecutaría con demasiada frecuencia, así que elija sabiamente.
Si establece gc.auto=0
, los objetos sueltos nunca se empaquetarán a menos que ejecutes git gc
a mano. Por lo tanto, podría haber cientos de miles de archivos acumulados en el mismo directorio, lo que podría ser un problema, especialmente para usuarios de discos duros mecánicos o Windows. (Consulte también:¿Cuántos archivos en un directorio son demasiados? y ¿Está bien (desde el punto de vista del rendimiento) tener cientos o miles de archivos en el mismo directorio de Linux?).