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?
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.
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
Selon ma réponse ici: Comment supprimer un répertoire du dépôt git?
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
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.
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
Remarque: cette solution fonctionne uniquement avec interface graphique de Github Desktop .
En utilisant GUI de Github Desktop c'est très simple.
Déplacez le dossier vers un autre emplacement (en dehors du dossier du projet) temporairement.
Editez votre fichier .gitignore
et supprimez l'entrée du dossier qui serait supprimer le référentiel maître sur la page github.
Validez et synchronisez le dossier du projet.
Re-déplacez le dossier dans le dossier du projet
Rééditez le fichier .gitignore
.
C'est tout.
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