251 votes

Resynchronisation du repo git avec le nouveau fichier .gitignore

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

Je viens d'ajouter d'autres ignorations( ?) à mon gitignore et j'aimerais supprimer les éléments déjà présents dans le repo qui correspondent au nouveau fichier.

2 votes

0 votes

C'est possible, mais cette solution supprimerait-elle les fichiers déjà commités correspondant au nouveau gitignore ?

131 votes

+1 pour avoir inventé le mot "ignoration".

467voto

VonC Points 414372

La solution mentionnée dans " Le fichier .gitignore n'est pas ignoré "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 commiter d'abord les changements que vous voulez garder pour éviter tout incident comme jball037 commentaires ci-dessous .
Le site --cached Cependant, cette option permet de conserver vos fichiers intacts sur votre disque).

Vous disposez également d'une autre solution plus fine dans l'article 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 des espaces dans leurs chemins

Si 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 qui ne correspondent pas resteront dans votre dépôt et devront être supprimés explicitement en mettant leur chemin entre guillemets :

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

0 votes

J'ai constaté que l'étape de git add n'est pas nécessaire, lorsque je lance git status après git rm --cached, les fichiers supprimés sont déjà dans la zone de transit et vous pouvez simplement aller de l'avant et les livrer.

10 votes

Je viens de l'exécuter, 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

0 votes

@jbal Je suis désolé pour cette mauvaise expérience, mais aussi confus : avez-vous gardé l'option --cached ? Cette option permet de s'assurer que les fichiers restent (intacts) sur votre disque, ce qui signifie que vos modifications devraient toujours être présentes.

10voto

gracchus Points 813

Je ne comprends peut-être pas bien, mais essayez-vous de supprimer les fichiers nouvellement ignorés ou voulez-vous ignorer les nouvelles modifications apportées à ces fichiers ? Dans ce cas, la chose fonctionne.

Si vous voulez supprimer les fichiers ignorés précédemment commités, utilisez alors

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

0 votes

C'est quoi ces guillemets ici ?

0 votes

C'est une excellente réponse

0 votes

C'est une méthode très simple pour supprimer les fichiers après la mise à jour de mon .gitignore. Cependant, elle nécessite quelques mises à jour mineures : `` git rm -cached git ls-files -i –exclude-standard git commit -m 'clean up ``

1voto

Jason Points 861

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 contenant des espaces est de ne pas les supprimer en les utilisant. --ignore-unmatch puis les supprimer manuellement, mais cela ne fonctionnera pas bien s'il y en a beaucoup.

Voici une solution qui utilise les tableaux de 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'

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