823 votes

Supprimer le répertoire du référentiel distant après les avoir ajoutés à .gitignore

Je me suis engagé et poussé un répertoire à github. Après cela, j'ai modifié le fichier .gitignore en ajoutant un répertoire qui devrait être ignoré. Tout fonctionne bien, mais le répertoire (maintenant ignoré) reste sur github.

Comment supprimer ce répertoire de github et l'historique du dépôt?

1393voto

Mark Longair Points 93104

Les règles dans votre .gitignore fichier ne s'appliquent sans traces de fichiers. Étant donné que les fichiers dans ce répertoire ont déjà été engagés dans le référentiel, vous devez unstage, de créer un commit et push à GitHub:

git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master

Vous ne pouvez pas supprimer le fichier à partir de votre histoire sans réécrire l'histoire de votre référentiel - vous ne devriez pas faire cela si quelqu'un d'autre est de travailler avec votre référentiel, ou que vous l'utilisez à partir de plusieurs ordinateurs. Si vous voulez continuer à le faire, vous pouvez utiliser git filter-branch de réécrire l'histoire - il y a un guide très utile ici.

En outre, notez la sortie de git rm -r --cached some-directory sera quelque chose comme:

rm 'some-directory/product/cache/1/small_image/130x130/small_image.jpg'
rm 'some-directory/product/cache/1/small_image/135x/small_image.jpg'
rm 'some-directory/.htaccess'
rm 'some-directory/logo.jpg'

L' rm le retour d'information est à partir de git sur le référentiel; les fichiers sont toujours dans le répertoire de travail.

331voto

Blundell Points 28342

Je fais ça:

 git rm --cached `git ls-files -i --exclude-from=.gitignore` 
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master
 

Ce qui supprimera tous les fichiers / dossiers qui sont dans votre git ignorer, vous épargnant de devoir les sélectionner manuellement


Cela semble avoir cessé de fonctionner pour moi, je sais faire:

  git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master
 

7voto

ChrisAelbrecht Points 371

La réponse de Blundell devrait fonctionner, mais pour une raison étrange, cela ne me concernait pas. J'ai dû canaliser d'abord les noms de fichiers générés par la première commande dans un fichier, puis faire une boucle dans ce fichier et supprimer ce fichier un par un.

 git ls-files -i --exclude-from=.gitignore > to_remove.txt
while read line; do `git rm -r --cached "$line"`; done < to_remove.txt
rm to_remove.txt
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master
 

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