117 votes

Comment supprimer un gros fichier commis par erreur dans git ?

Duplicata possible :
Comment purger un fichier volumineux de l'historique des commits dans Git ?

J'ai fait une bêtise. Imaginez que j'ai commis un fichier de 100 Mo. Puis je vois ceci, je supprime ce fichier et j'engage à nouveau. Il s'agit d'une procédure normale pour supprimer un fichier.

Mais maintenant l'effet secondaire est que mon historique est lourd parce qu'il a sauvegardé ce grand fichier (je crois que c'est pour cela qu'il est lourd). Je n'utilise que git local, donc je ne synchronise avec aucun serveur.

Comment puis-je supprimer définitivement ce fichier et économiser de l'espace disque ?

231voto

Leo Points 2175

Vous pouvez le faire en utilisant la commande git filter-branch comme suit :

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch path_to_file" HEAD

Vous pouvez trouver plus de documentation ici http://dalibornasevic.com/posts/2-permanently-remove-files-and-folders-from-a-git-repository

27voto

JaredPar Points 333733

La commande que vous recherchez est la suivante filter-branch . Il permet de supprimer définitivement des dossiers d'un enrôlement. Ce blog propose un excellent tutoriel sur la manière de supprimer les fichiers problématiques du référentiel.

21voto

topek Points 8288

Vous pouvez utiliser cet excellent script à partir de David Underhill pour supprimer le fichier du dépôt git :

#!/bin/bash
set -o errexit

# Author: David Underhill
# Script to permanently delete files/folders from your git repository.  To use 
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2

if [ $# -eq 0 ]; then
    exit 0
fi

# make sure we're at the root of git repo
if [ ! -d .git ]; then
    echo "Error: must run this script from the root of a git repository"
    exit 1
fi

# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD

# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X