Skip to main content

Solución de problemas del límite de push de 2 GiB

Aprenda a esquivar el límite de carga de 2 GiB.

Acerca del límite de empuje

GitHub tiene un límite máximo de 2 GiB para un solo push. Puedes alcanzar este límite al intentar cargar repositorios muy grandes por primera vez, importar repositorios grandes desde otras plataformas o al intentar volver a escribir el historial de repositorios existentes de gran tamaño.

Si alcanzas este límite, puedes ver uno de los siguientes mensajes de error:

  • fatal: the remote end hung up unexpectedly
  • remote: fatal: pack exceeds maximum allowed size

Puedes desglosar el push en partes más pequeñas o eliminar el historial de Git y empezar desde cero. Si ha realizado una única confirmación mayor que 2 GiB y no puede eliminar el historial de Git y empezar desde cero, deberá realizar una rebase interactiva para dividir la confirmación grande en varias más pequeñas.

División de un empuje grande

Puede evitar el límite dividiendo el envío en partes más pequeñas, cada una de las cuales debe tener un tamaño inferior a 2 GiB. Si una rama está dentro de este límite de tamaño, puedes empujarla toda a la vez. Sin embargo, si una rama es mayor que 2 GiB, deberá dividir el empuje en partes aún más pequeñas y subir solo algunas confirmaciones a la vez.

  1. Si aún no has configurado el repositorio remoto, agrega el repositorio como un nuevo repositorio remoto. Para más información, consulta Administrar repositorios remotos.

  2. Para buscar confirmaciones adecuadas distribuidas en el historial de la rama principal del repositorio local, ejecuta el siguiente comando:

    git log --oneline --reverse refs/heads/BRANCH-NAME | awk 'NR % 1000 == 0'
    

    Este comando revela cada confirmación número 1000. Puedes aumentar o disminuir el número para ajustar el tamaño del paso.

  3. Inserta cada una de estas confirmaciones de una en una en el repositorio hospedado de GitHub.

    git push REMOTE-NAME +<YOUR_COMMIT_SHA_NUMBER>:refs/heads/BRANCH-NAME
    

    Si ves el mensaje remote: fatal: pack exceeds maximum allowed size, reduce el tamaño del paso en el paso 2 e inténtalo de nuevo.

  4. Sigue el mismo proceso para cada confirmación (commit) que hayas identificado en el historial del paso 2.

  5. Si es la primera vez que este repositorio se empuja a GitHub, realiza un empuje espejo final para asegurarte de que las referencias restantes se suban.

    git push REMOTE-NAME --mirror
    

    Si sigue siendo demasiado grande, deberás empujar otras ramas en varias fases siguiendo los mismos pasos.

Una vez que estés familiarizado con el procedimiento, puedes automatizar los pasos 2 a 4 para simplificar el proceso. Por ejemplo:

step_commits=$(git log --oneline --reverse refs/heads/BRANCH-NAME | awk 'NR % 1000 == 0')
echo "$step_commits" | while read commit message; do git push REMOTE-NAME +$commit:refs/heads/BRANCH-NAME; done

Comienzo desde cero

Si el repositorio no tiene ningún historial o la confirmación inicial era superior a 2 GiB por sí sola y no le importa restablecer el historial de Git, también puede empezar desde cero.

  1. En la copia local, elimina la carpeta oculta .git para quitar todo el historial de Git anterior y convertirlo de nuevo en una carpeta normal llena de archivos.

  2. Cree una nueva carpeta vacía.

  3. Ejecutea git init y git lfs install en la nueva carpeta y agrega el nuevo repositorio vacío GitHub como un repositorio remoto.

  4. Si ya usas Almacenamiento de archivos de gran tamaño de Git y tienes todas las reglas de seguimiento de Git LFS que piensas usar ya enumeradas en el archivo .gitattributes de la carpeta antigua, ese debe ser el primer archivo que copies en la nueva carpeta. Debes asegurarte de que las reglas de seguimiento estén en su lugar antes de agregar cualquier otro archivo, de modo que no haya ninguna posibilidad de que Git LFS se suba al almacenamiento de Git normal.

    Si aún no usas Git LFS, puedes omitir este paso o configurar las reglas de seguimiento que quieres usar en el archivo .gitattributes de la nueva carpeta antes de copiar cualquier otro archivo. Para más información, consulta Configurar el almacenamiento de archivos Git de gran tamaño.

  5. Mueva lotes de archivos menores que 2 GiB de la carpeta anterior a la nueva carpeta. Después de mover cada lote, crea un commit y empújalo antes de mover el siguiente lote. Puede adoptar un enfoque cauteloso y limitarse a alrededor de 2 GiB. Como alternativa, si tiene una carpeta con archivos destinados a Git LFS, puede omitir esos archivos al considerar el límite de 2 GiB por lote.

Una vez que la carpeta antigua está vacía, el repositorio GitHub debe contener todo. Si usas Git LFS, todos los archivos destinados a Git LFS deben insertarse en el almacenamiento de Git LFS.