web-dev-qa-db-fra.com

Comment supprimer un gros fichier commis à tort dans git

Duplicata possible:
Comment purger un énorme fichier de l'historique des validations dans Git?

J'ai fait une chose stupide. Imaginez que j'ai validé un fichier de 100 Mo. Ensuite, je vois cela et je supprime ce fichier et je recommence. Il s'agit d'une procédure normale pour supprimer un fichier.

Mais maintenant, l'effet secondaire est que mon historique est lourd car il a enregistré ce gros fichier (je crois que c'est pourquoi il est lourd). J'utilise uniquement git local, donc je ne synchronise sur aucun serveur.

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

79
Rodrigo

Vous pouvez le faire en utilisant le git filter-branch commande, comme ceci:

git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD

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

147
Leo

La commande que vous recherchez est filter-branch. Il vous permet de supprimer définitivement des fichiers d'une inscription. Ce blog a un excellent tutoriel sur la façon de supprimer les fichiers problématiques du référentiel

26
JaredPar

Vous pouvez prendre ce super script 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
17
topek