Resynchroniser le dépôt git avec un nouveau fichier .gitignore


203

Est-il possible de "rafraîchir" un dépôt git après la mise à jour du fichier gitignore?

Je viens d'ajouter plus d'ignorations (?) À mon gitignore et j'aimerais supprimer des éléments déjà dans le dépôt correspondant au nouveau fichier.



Peut-être, cette solution supprimerait-elle les fichiers déjà validés correspondant au nouveau gitignore?
Christian Wattengård

106
+1 pour avoir inventé le mot «ignorance».
Aasmund Eldhuset

3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset il est officiel
Daniel Springer

1
@ user770: Aujourd'hui, j'ai appris!
Aasmund Eldhuset

Réponses:


387

La solution mentionnée dans "le fichier .gitignore n'ignore pas " est un peu extrême, mais devrait fonctionner:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( assurez-vous de valider d'abord les modifications que vous souhaitez conserver , pour éviter tout incident, comme jball037 commente ci-dessous .
L' --cachedoption gardera vos fichiers intacts sur votre disque.)

Vous avez également une autre solution plus fine dans le billet de blog " Faire en sorte que Git ignore les fichiers déjà suivis ":

git rm --cached `git ls-files -i --exclude-standard`

Bassim suggère dans son montage :

Fichiers avec de l'espace dans leurs chemins

Dans le cas où vous obtenez un message d'erreur comme fatal: path spec '...' did not match any files, il peut y avoir des fichiers avec des espaces dans leur chemin.

Vous pouvez supprimer tous les autres fichiers avec l'option --ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

mais les fichiers sans correspondance resteront dans votre référentiel et devront être supprimés explicitement en mettant leur chemin entre guillemets:

git rm --cached "<path.to.remaining.file>"

J'ai trouvé que l'étape git add n'est pas nécessaire, lorsque j'exécute git status après git rm --cached, les fichiers supprimés sont déjà dans la zone de préparation et vous pouvez simplement les valider.
chap

4
Je viens de courir, j'ai perdu tous mes changements non engagés et j'ai failli annoncer ma démission de mon travail. La réponse acceptée sur ce fil m'a sauvé la vie: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037

2
@VonC désolé, ce n'était pas censé être une diatribe ou un bâton :) Mais oui, j'ai utilisé --cached et toutes mes modifications non validées ont été perdues lorsque j'ai vérifié mes fichiers. Paniqué pendant un moment mais "git reset HEAD" a restauré mes fichiers (mais cette fois sans les fichiers que j'ai spécifiés dans .gitignore, donc votre solution fonctionnait toujours!)
jball037

3
@ jball037 Bien. J'ai ajouté l'avertissement et modifié la réponse en conséquence.
VonC

1
si seulement je lis une ligne plus loin avant de faire ceci "(assurez-vous de valider d'abord vos modifications que vous souhaitez conserver, pour éviter tout incident comme jball037" #fml
Aiden Strydom

9

Je pourrais mal comprendre, mais essayez-vous de supprimer des fichiers récemment ignorés ou souhaitez-vous ignorer les nouvelles modifications apportées à ces fichiers? Dans ce cas, la chose fonctionne.

Si vous souhaitez supprimer les fichiers ignorés précédemment validés, utilisez

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'

Qu'est-ce que les guillemets simples ici?
IgorGanapolsky

C'est une excellente réponse
Holene

C'est une raison très simple de supprimer des fichiers après avoir mis à jour mon .gitignore Cependant, il faut quelques mises à jour mineures: `` git rm –cached git ls-files -i –exclude-standard git commit -m 'clean up' '
Aaron

1

Je sais que c'est une vieille question, mais la solution de gracchus ne fonctionne pas si les noms de fichiers contiennent des espaces. La solution de VonC pour les noms de fichiers avec des espaces est de ne pas les supprimer en utilisant --ignore-unmatch, puis de les supprimer manuellement, mais cela ne fonctionnera pas bien s'il y en a beaucoup.

Voici une solution qui utilise des tableaux bash pour capturer tous les fichiers.

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

git commit -m 'ignore update'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.