Skip to main content

Dépannage de la limite d’envoi de 2 Go

Découvrez comment contourner la limite d’envoi de 2 Go.

À propos de la limite d’envoi

GitHub a une limite maximale de 2 Go pour un seul envoi. Vous pouvez atteindre cette limite lorsque vous essayez de télécharger des référentiels très volumineux pour la première fois, d’importer des référentiels volumineux à partir d’autres plateformes ou de réécrire l’historique des référentiels volumineux existants.

Si vous atteignez cette limite, vous pourriez voir apparaître l’un des messages d’erreur suivants :

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

Vous pouvez soit diviser votre fichier d’envoi (push) en plusieurs parties, soit supprimer l’historique Git et recommencer à zéro. Si vous avez effectué un commit unique de plus de 2 Go et que vous ne pouvez pas supprimer l’historique Git et reprendre à zéro, vous devrez alors effectuer un rebase interactif pour fractionner le commit volumineux en plusieurs commits plus petits.

Fractionnement d’un grand envoi

Vous pouvez éviter d’atteindre cette limite en divisant votre fichier d’envoi en plusieurs petites parties, chacune d’entre elles devant avoir une taille inférieure à 2 Go. Si une branche ne dépasse pas cette limite, vous pouvez l’envoyer en une seule fois. Toutefois, si une branche est supérieure à 2 Go, vous devez fractionner le fichier d’envoi en plus petites portions et envoyer tout juste quelques commits à la fois.

  1. Si vous n’avez pas encore configuré le référentiel distant, ajoutez le référentiel en tant que nouveau référentiel distant. Pour plus d’informations, consultez « Création de dépôt distants ».

  2. Pour trouver les commits appropriés répartis dans l’historique de la branche principale de votre référentiel local, exécutez la commande suivante :

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

    Cette commande permet d’afficher chaque 1000ème commit. Vous pouvez augmenter ou diminuer le nombre pour ajuster la taille de l’étape.

  3. Envoyez chacun de ces commits à la fois vers votre référentiel hébergé GitHub.

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

    Si le message remote: fatal: pack exceeds maximum allowed size s’affiche, réduisez la taille de l’étape à l’étape 2 et réessayez.

  4. Suivez le même processus pour chaque commit que vous avez identifié dans l’historique à partir de l’étape 2.

  5. S’il s’agit de la première fois que ce référentiel est envoyé vers GitHub, effectuez un envoi miroir final pour vous rassurer que toutes les refs restantes ont été envoyées.

    git push REMOTE-NAME  --mirror
    

    Si cela est encore trop volumineux, vous devrez envoyer d’autres branches par étapes en suivant la même procédure.

Une fois que vous connaissez la procédure, vous pouvez automatiser les étapes 2 à 4 pour simplifier le processus. Par exemple :

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

Reprendre à zéro

Si le référentiel n’a pas d’historique ou si votre commit initial dépasse 2 Go à lui seul et que vous ne voyez pas d’inconvénient à réinitialiser l’historique Git, vous pouvez également reprendre à zéro.

  1. Sur votre copie locale, supprimez le dossier masqué .git pour supprimer l’historique Git précédent et le convertir en dossier normal contenant des fichiers.

  2. créer un dossier vide.

  3. Exécutez et git init accédez git lfs install dans le nouveau dossier, puis ajoutez le nouveau référentiel GitHub en tant que référentiel distant.

  4. Si vous utilisez déjà Stockage Fichiers volumineux Git et que toutes les règles de suivi Git LFS que vous souhaitez utiliser sont déjà répertoriées dans le fichier .gitattributes de l’ancien dossier, ce fichier devrait être le premier que vous copiez dans le nouveau dossier. Vous devez vous assurer que les règles de suivi sont en place avant d’ajouter d’autres fichiers, afin qu’il n’y ait aucune chance que les données Git LFS soient validées dans le stockage Git standard.

    Si vous n’utilisez pas encore Git LFS, vous pouvez ignorer cette étape ou définir les règles de suivi que vous voulez utiliser dans le fichier .gitattributes du nouveau dossier avant de copier d’autres fichiers. Pour plus d’informations, consultez « Configuration de Git Large File Storage ».

  5. Déplacez des lots de fichiers inférieurs à 2 Go de l’ancien dossier vers le nouveau dossier. Une fois chaque lot déplacé, créez un commit et envoyez-le avant de déplacer le lot suivant. Vous pouvez adopter une approche prudente et vous en tenir à environ 2 Go. Par ailleurs, si vous avez un dossier contenant des fichiers destinés à Git LFS, vous pouvez ignorer ces fichiers lorsque vous tenez compte de la limite de 2 Go par lot.

Une fois l’ancien dossier vide, le référentiel GitHub devrait tout contenir. Si vous utilisez Git LFS, tous les fichiers destinés à Git LFS doivent être poussés vers le stockage Git LFS.