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 unexpectedlyremote: 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.
-
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.
-
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.
-
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-NAMESi 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. -
Sigue el mismo proceso para cada confirmación (commit) que hayas identificado en el historial del paso 2.
-
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 --mirrorSi 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.
-
En la copia local, elimina la carpeta oculta
.gitpara quitar todo el historial de Git anterior y convertirlo de nuevo en una carpeta normal llena de archivos. -
Cree una nueva carpeta vacía.
-
Ejecutea
git initygit lfs installen la nueva carpeta y agrega el nuevo repositorio vacío GitHub como un repositorio remoto. -
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
.gitattributesde 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
.gitattributesde 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. -
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.