Actuellement j'ai
- Dépôt GitHub vide
- Dépôt de serveur SSH (principal)
- Dépôt local
Le repo du serveur SSH était le repo le plus récent (site de production), j'ai donc fait un clone Git de là vers le local. J'ai ensuite essayé de faire un git push
GitHub.
Tout s'est bien passé, mais cela a dit que le nom de fichier.gz était trop grand pour GitHub. Je n'avais pas besoin de ce fichier, j'ai donc exécuté plusieurs commandes Git pour m'en débarrasser du cache Git, puis repoussé vers le serveur SSH.
Je ne vois pas le gros fichier localement mais il est toujours sur le serveur SSH même si git diff
ne renvoie rien et git push renvoie "Tout est à jour" - Et même si le fichier n'est pas visible dans le référentiel local lorsque j'essaie de pousser vers GitHub je reçois toujours une erreur à ce sujet
à distance: erreur: le fichier fpss.tar.gz fait 135,17 Mo; cela dépasse la limite de taille de fichier de GitHub de 100 Mo
J'ai suivi les étapes sous "résoudre le problème" répertoriées dans l'aide de GitHub, cela n'aurait-il pas dû être suffisant?
Comment le fichier est-il toujours dans l'éther quand il n'est pas local ou répertorié dans git status / diff / push?
git log -- the_big_file
vous retourne quelque chose, le fichier est toujours dans l'historique.git push
que tout est à jour? Depuis que vous avez changé d'histoire, il aurait dû se plaindre que la poussée n'est pas possible et que vous auriez à la forcer.Réponses:
Vous pouvez utiliser
Cela supprimera tout dans l'historique de ce fichier. Le problème est que le fichier est présent dans l'historique.
Cette commande modifie les hachages de vos validations, ce qui peut être un vrai problème, en particulier sur les référentiels partagés. Il ne doit pas être effectué sans comprendre les conséquences.
la source
--all
indicateur au lieu deHEAD
Rewrite 657560fa18c030bcfac9132ce1c3541e84a5bc2c (1/10) (0 seconds passed, remaining 0 predicted) /usr/lib/git-core/git-filter-branch: 1: eval: Syntax error: end of file unexpected
J'ai trouvé que le squash était plus utile que
filter-branch
. J'ai fait ce qui suit:git reset --soft HEAD~3
.git commit -m "New message for the combined commit"
Cas spécial (de l'utilisateur @lituo): Si ci-dessus ne fonctionne pas, vous pouvez avoir ce cas. La validation 1 incluait le fichier volumineux et la transmission de la validation 1 a échoué en raison d'une erreur de fichier volumineux. Commit 2 a supprimé le fichier volumineux,
git rm --cached [file_name]
mais la transmission de Commit 2 a toujours échoué. Vous pouvez suivre les mêmes étapes ci-dessus mais au lieu d'utiliserHEAD~3
, utilisezHEAD~2
.la source
Voici quelque chose que j'ai trouvé très utile si vous avez déjà joué avec votre repo avant de demander de l'aide. Premier type:
Après cela, vous devriez voir quelque chose dans le sens de
La partie importante est le "2 commits"! De là, allez-y et tapez:
Ainsi, pour l'exemple ci-dessus, on taperait:
Après avoir tapé cela, votre "statut git" devrait dire:
À partir de là, vous pouvez supprimer le gros fichier (en supposant que vous ne l'avez pas déjà fait) et vous devriez pouvoir tout recommencer sans perdre votre travail.
Je sais que ce n'est pas une réponse super sophistiquée, mais j'espère que cela aide!
la source
Si le fichier a été ajouté avec votre commit le plus récent et que vous n'avez pas poussé vers le référentiel distant , vous pouvez supprimer le fichier et modifier le commit, à partir d' ici :
la source
untracked
liste de fichiers àgit status
.git rm --cached giant_file commit_id
mais ça n'a pas marché :(J'ai eu un problème similaire et j'ai utilisé l' étape ci-dessus pour supprimer le fichier. Cela a parfaitement fonctionné.
J'ai ensuite reçu une erreur sur un deuxième fichier que je devais supprimer:
remote: error: File <path/filename> is 109.99 MB; this exceeds GitHub's file size limit of 100.00 MB
J'ai essayé la même étape, j'ai eu une erreur:
"A previous backup already exists in <path/filename>"
De la recherche sur ce site, j'ai utilisé la commande:
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch <path/filename>" --prune-empty --tag-name-filter cat -- --all
Fonctionne très bien et les gros fichiers ont été supprimés.
Incroyablement, le push a toujours échoué avec une autre erreur:
error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104 fatal: The remote end hung up unexpectedly
J'ai résolu ce problème en modifiant directement le fichier de configuration .git -
postBuffer = 999999999
Après cela, la poussée est passée!
la source
git rm
j'avais besoin de donner le nom complet du chemin du référentiel pour le fichier et d'échapper au # avec une barre oblique inverse pour le faire fonctionnerreset hard
étape au bas de la page avec une simple poussée. czettner.com/2015/07/16/…Pourquoi GitHub rejette mon dépôt, même après avoir supprimé le gros fichier?
Git stocke l'historique complet de votre projet, donc même si vous `` supprimez '' un fichier de votre projet, le référentiel Git a toujours une copie du fichier dans son historique, et si vous essayez de pousser vers un autre référentiel (comme celui hébergé sur GitHub), puis Git requiert que le référentiel distant ait le même historique que votre référentiel local (c'est-à-dire les mêmes gros fichiers dans son historique).
Comment puis-je faire en sorte que GitHub accepte mon dépôt?
Vous devez nettoyer l'historique Git de votre projet localement, en supprimant les gros fichiers indésirables de tout l'historique, puis utiliser uniquement l'historique `` nettoyé '' à l'avenir. Les identifiants de validation Git des validations affectées changeront.
Comment nettoyer les gros fichiers de mon référentiel Git?
Le meilleur outil pour nettoyer les gros fichiers indésirables de l'historique Git est le BFG Repo-Cleaner - c'est une alternative plus simple et plus rapide à
git-filter-branch
spécifiquement conçue pour supprimer les fichiers indésirables de l'historique Git.Suivez attentivement les instructions d'utilisation , la partie principale est la suivante:
Tous les fichiers de plus de 100 Mo (qui ne figurent pas dans votre dernière validation) seront supprimés de l'historique de votre référentiel Git. Vous pouvez ensuite utiliser
git gc
pour nettoyer les données mortes:Le BFG est généralement au moins 10 à 50 fois plus rapide que son fonctionnement
git-filter-branch
et généralement beaucoup plus facile à utiliser.Divulgation complète: je suis l'auteur du BFG Repo-Cleaner.
la source
J'ai essayé toutes les méthodes ci-dessus, mais aucune ne fonctionne pour moi.
Ensuite, j'ai trouvé ma propre solution.
Tout d'abord, vous avez besoin d'un dépôt local propre et à jour. Supprimez tous les putains de gros fichiers.
Créez maintenant un nouveau dossier À L'EXTÉRIEUR de votre dossier repo et utilisez "Git create repository here" pour en faire un nouveau dépôt Git, appelons-le new_local_repo. Ça y est ...! Toutes les méthodes ci-dessus ont dit que vous devez nettoyer l'historique ... eh bien, j'en ai marre de ça, créons un nouveau dépôt qui n'a aucun historique!
Copiez les fichiers de votre ancien référentiel local foutu vers le nouveau et magnifique référentiel. Notez que le logo vert sur l'icône du dossier disparaîtra, c'est prometteur car c'est un nouveau repo!
Validez sur la branche locale, puis appuyez sur pour créer une nouvelle branche distante. Appelons cela new_remote_branch. Si vous ne savez pas comment pousser à partir d'un nouveau dépôt local, recherchez-le sur Google.
Félicitations! Vous avez transmis votre code propre et à jour à GitHub. Si vous n'avez plus besoin de la branche principale distante, vous pouvez faire de votre new_remote_branch une nouvelle branche principale. Si vous ne savez pas comment le faire, recherchez-le sur Google.
Dernière étape, il est temps de supprimer l'ancien référentiel local foutu. À l'avenir, vous n'utiliserez que new_local_repo.
la source
J'ai le même problème et aucune des réponses ne fonctionne pour moi. J'ai résolu par les étapes suivantes:
1. Trouvez quel (s) commit (s) contient le gros fichier
La dernière validation est la plus ancienne validation de la liste des résultats.
2. Trouvez celui juste avant le plus ancien.
Supposons que vous ayez:
3. Git rebase
Astuces :
drop
pour les commits contient le gros fichier.git rebase --continue
continuer jusqu'à ce que vous ayez terminé.git rebase --abort
pour l'annuler.la source
cela devrait réécrire vos commits locaux avec les nouvelles références lfs
https://github.com/git-lfs/git-lfs/blob/master/docs/man/git-lfs-migrate.1.ronn?utm_source=gitlfs_site&utm_medium=doc_man_migrate_link&utm_campaign=gitlfs#examples
la source
La solution pour conserver les gros fichiers / dossiers dans le dossier de travail
C'est la ligne qui a travaillé pour résoudre le problème posé ici (à partir de la réponse 1):
git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD
Cette commande supprime également le fichier / dir si le fichier / dir se trouve dans l'arborescence de travail.
Si vous souhaitez conserver le fichier / dossier dans l'arborescence de travail, je propose de suivre les étapes suivantes.
git reset HEAD^
Ajoutez le fichier / dossier en question dans le fichier `` .gitignore ''.
Procédez comme d'habitude
git add .
qui pourrait capturer d'autres fichiers / dossiers mais doit capturer le.gitignore
fichier. Vient ensuitegit commit -m"message"
et enfingit push origin <branch_name>
la source
cela a fonctionné pour moi. documentation de github Squashing Git Commits git reset origin / master
trouver la documentation ici
la source
J'ai donc rencontré une situation particulière: j'ai cloné un référentiel de gitlab, qui contenait un fichier de plus de 100 Mo, mais a été supprimé à un moment donné de l'historique de git. Plus tard, lorsque j'ai ajouté un nouveau dépôt privé github et que j'ai essayé de pousser vers le nouveau dépôt, j'ai eu la fameuse erreur «fichier trop volumineux». À ce stade, je n'avais plus accès au dépôt gitlab d'origine. Cependant, je pouvais toujours pousser vers le nouveau
bfg-repo-cleaner
dépôt github privé en utilisant un référentiel LOCAL sur ma machine:la source
Parfois, le fichier est conservé dans l'historique de suivi, essayez les étapes suivantes:
git commit
, Si vous voyez le mode de création avec le gros fichier répertorié, procédez comme suit:git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch filename' HEAD
. Vous devriez voir un tas de réécritures affichées dans votre console qui se termine par:rm 'filename' et
la dernière ligne Ref a été réécrite.
C'est fait.
la source
J'ajoute à la première réponse.
Il y aura un conflit de fusion d'origine / maître.
Veuillez exécuter ceci
Il supprimera toutes mes modifications échelonnées et non échelonnées, oubliera tout sur ma branche locale actuelle et le rendra exactement identique à origin / master.
la source