web-dev-qa-db-fra.com

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

J'ai commis et poussé un répertoire à github. Après cela, j'ai modifié le fichier .gitignore en ajoutant un répertoire à ignorer. Tout fonctionne bien, mais le répertoire (maintenant ignoré) reste sur github.

Comment puis-je supprimer ce répertoire de github et l'historique du référentiel?

528
janw

Les règles de votre fichier .gitignore ne s'appliquent qu'aux fichiers non suivis. Comme les fichiers de ce répertoire ont déjà été validés dans votre référentiel, vous devez les décompresser, créer un commit et les transmettre à 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 de votre historique sans réécrire l'historique de votre référentiel. Ne le faites pas si quelqu'un d'autre utilise votre référentiel ou si vous l'utilisez à partir de plusieurs ordinateurs. Si vous voulez toujours le faire, vous pouvez utiliser git filter-branch pour réécrire l'historique - il existe un guide utile à cet égard ici .

De plus, notez que 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'

La rm est le retour d'information de git sur le dépôt; les fichiers sont toujours dans le répertoire de travail.

946
Mark Longair

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

Qui supprimera tous les fichiers/dossiers qui se trouvent dans votre git ignore, sauf que vous devez les sélectionner manuellement


Cela semble avoir cessé de fonctionner pour moi, je fais maintenant:

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git Push Origin master
226
Blundell

Selon ma réponse ici: Comment supprimer un répertoire du dépôt git?

Pour supprimer le dossier/répertoire uniquement du référentiel git et non du local, essayez 3 étapes simples.


Procédure pour supprimer le répertoire

git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git Push Origin master

Étapes à suivre pour ignorer ce dossier lors des prochains commits

Pour ignorer ce dossier des commits suivants, créez un fichier à la racine nommé . Gitignore et entrez le nom de ce dossier. Vous pouvez en mettre autant que vous voulez

. Le fichier gitignore ressemblera à ceci

/FolderName

remove directory

46
eirenaios

La première réponse de Blundell n'a pas fonctionné pour moi. Cependant cela m'a montré le bon chemin. J'ai fait la même chose comme ça:

> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git Push Origin master

Je vous conseille de vérifier d'abord les fichiers à supprimer en exécutant l'instruction ci-dessous:

git ls-files -i --exclude-from=.gitignore

J'utilisais un fichier .gitignore par défaut pour Visual Studio et j'ai remarqué qu'il supprimait tous les dossiers de journalisation et les dossiers bin du projet, ce qui n'était pas l'action souhaitée.

6
Oncel Umut TURER

La réponse de Blundell devrait marcher, mais pour une raison étrange, cela ne m'a pas été égal. Je devais d'abord diriger les noms de fichiers générés par la première commande dans un fichier, puis parcourir ce fichier et le supprimer 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
5
Chris Aelbrecht

Remarque: cette solution fonctionne uniquement avec interface graphique de Github Desktop .

En utilisant GUI de Github Desktop c'est très simple.

  1. Déplacez le dossier vers un autre emplacement (en dehors du dossier du projet) temporairement.

  2. Editez votre fichier .gitignore et supprimez l'entrée du dossier qui serait supprimer le référentiel maître sur la page github.

  3. Validez et synchronisez le dossier du projet.

  4. Re-déplacez le dossier dans le dossier du projet

  5. Rééditez le fichier .gitignore.

C'est tout.

2
efkan

Si vous travaillez avec PowerShell, essayez ce qui suit en une seule commande.

PS MyRepo> git filter-branch --force --index-filter
>> "git rm --cached --ignore-unmatch -r .\\\path\\\to\\\directory"
>> --Prune-empty --tag-name-filter cat -- --all

Ensuite, git Push --force --all.

Documentation: https://git-scm.com/docs/git-filter-branch

0
Shaun Luttin