Ignorer les fichiers qui ont déjà été engagés dans un dépôt Git [dupliquer]
cette question a déjà une réponse ici:
- Comment faire de Git "oublier" un fichier qui a été suivi, mais est maintenant en .gitignore? 20 réponses
j'ai un dépôt git déjà initialisé auquel j'ai ajouté un fichier .gitignore
. Comment puis-je rafraîchir l'index des fichiers pour que les fichiers Je veux ignoré ignoré?
21 réponses
pour déverrouiller un single fichier qui a déjà été ajouté/initialisé à votre dépôt, i.e. , arrêter de suivre le fichier mais ne pas le supprimer de votre utilisation du système: git rm --cached filename
pour déverrouiller chaque fichier qui est maintenant dans votre .gitignore
:
commettez D'abord tout changement de code en cours , puis exécutez cette commande:
git rm -r --cached .
cela supprime tous les fichiers modifiés de index (zone de transit), puis il suffit d'exécuter:
git add .
s'Engager:
git commit -m ".gitignore is now working"
pour annuler git rm --cached filename
, utilisez git add filename
.
assurez-vous d'effectuer tous vos changements importants avant de lancer
git add .
Sinon, vous perdrez tout changement d'autres fichiers.
si vous essayez d'ignorer les modifications apportées à un fichier déjà suivi dans le dépôt (par exemple un dev.propriétés fichier que vous auriez besoin de changer pour votre environnement local, mais vous ne voudriez jamais vérifier ces changements) que ce que vous voulez faire est:
git update-index --assume-unchanged <file>
Si vous voulez commencer le suivi des changements de nouveau
git update-index --no-assume-unchanged <file>
Voir git-mise à jour de l'index(1) Page de Manuel de .
aussi jeter un oeil aux skip-worktree
et no-skip-worktree
options pour update-index si vous avez besoin de cela pour persister après un git-reset ( via )
mise à Jour: Puisque les gens ont demandé, voici un alias pratique (et mis à jour depuis commenté ci-dessous) pour voir quels fichiers sont actuellement "ignorés" (--supposer-inchangé) dans votre espace de travail local
$ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]"
pour déverrouiller un fichier qui a déjà été ajouté/initialisé à votre dépôt, c'est-à-dire arrêter de suivre le fichier mais ne pas le supprimer de votre utilisation du système: git rm --cached filename
Oui .gitignore
d'un seul système ignore les fichiers qui ne sont pas actuellement sous contrôle de version de git.
i. e. si vous avez déjà ajouté un fichier appelé test.txt
en utilisant git-add
, alors l'ajout de test.txt
à .gitignore
causera toujours des changements à test.txt
à suivre.
vous devez d'abord git rm test.txt
et engager ce changement. Ce n'est qu'alors que les changements à test.txt
seront ignorés.
supprimer les espaces vides .gitignore
aussi, assurez-vous que vous n'avez pas de blancs traînants dans votre espace .gitignore. Je suis arrivé à cette question parce que je cherchais une réponse, puis j'ai eu un drôle de sentiment que je devrais ouvrir l'éditeur au lieu de juste cat'ing .gitignore. Supprimé un seul espace supplémentaire de la fin et poof il fonctionne maintenant:)
j'ai suivi ces étapes
git rm -r --cached .
git add .
git reset HEAD
après cela, git supprimer tous les fichiers (*.swp dans mon cas) qui devrait être ignorant.
si vous voulez arrêter de suivre le fichier sans supprimer le fichier de votre système local, que je préfère pour ignorer config/database.yml
fichier. Essayez simplement:
git rm --cached config/database.yml
# this will delete your file from git history but not from your local system.
Maintenant, ajoutez ce fichier au fichier .gitignore
et propagez les modifications. Et à partir de maintenant, tout changement apporté à la configuration/base de données.yml ne sera pas suivi par git.
$ echo config/database.yml >> .gitignore
Merci
Pour supprimer quelques fichiers spécifiques de suivi:
git update-index --assume-unchanged path/to/file
Si jamais vous voulez commencer le suivi de nouveau:
git update-index --no-assume-unchanged path/to/file
comme dav_i le dit, pour conserver le fichier dans repo et le supprimer des modifications sans créer de propagation supplémentaire, vous pouvez utiliser:
git update-index --assume-unchanged filename
des réponses complexes partout!
il suffit d'utiliser ce qui suit
git rm -r --cached .
il va supprimer les fichiers que vous essayez d'ignorer de l'origine et non du maître sur votre ordinateur!
après ça, commettez et poussez!
ne sachant pas tout à fait ce que l'ordre de "réponse" a fait, je l'ai couru, à mon grand désarroi. Il supprime récursivement chaque fichier de votre git repo.
Stackoverflow à la rescousse... Comment rétablir un "git rm-r ."?
git reset HEAD
a fait l'affaire, puisque j'avais des fichiers locaux non engagés que je ne voulais pas écraser.
Il ya une autre suggestion peut-être pour les gars lents comme moi =) mettre le .gitignore fichier dans votre dossier racine du référentiel pas dans .dossier git . Acclamations!
aucune des réponses n'a fonctionné pour moi.
au lieu de:
- déplacer le fichier hors du répertoire contrôlé par git
- Vérifier la suppression dans le dépôt git
- renvoie le fichier dans le répertoire contrôlé par git
après avoir déplacé le fichier, git l'ignorera.
Fonctionne avec des répertoires aussi!
un autre problème que j'ai eu était j'ai placé un commentaire en ligne.
tmp/* # ignore my tmp folder (this doesn't work)
ça fonctionne
# ignore my tmp folder
tmp/
Si les fichiers sont déjà dans le contrôle de version, vous devez les supprimer manuellement.
grâce à votre réponse, j'ai pu écrire cette petite doublure pour l'améliorer. J'ai couru sur mon .gitignore et des pensions, et pas eu de problèmes, mais si quelqu'un voit tous les problèmes flagrants, s'il vous plaît commentaire. Cela devrait git rm -r --cached
de .gitignore
:
cat $(git rev-parse --show-toplevel)/.gitIgnore | sed "s//$//" | grep -v "^#" | xargs -L 1 -I {} trouvez $(git rev-parse --show-toplevel) -nom "{}" | xargs -L 1 git rm -r --en cache
notez que vous obtiendrez beaucoup de fatal: pathspec '<pathspec>' did not match any files
. C'est juste pour les fichiers qui n'ont pas été modifiés.
j'ai trouvé un problème bizarre avec .gitignore. Tout était en place et semblait correct. La seule raison pour laquelle mon .gitignore a été "ignoré" était, que la fin de ligne était en format Mac (\r). Ainsi, après avoir sauvegardé le fichier avec la fin de ligne correcte (en vi en utilisant :set ff=unix) tout a fonctionné comme un charme!
un autre problème non mentionné ici est si vous avez créé votre .gitignore dans Windows notepad il peut ressembler à du charabia sur d'autres plateformes comme je l'ai découvert. La clé est de vous assurer que l'encodage est défini à ANSI dans notepad, (ou faire le fichier sur linux comme je l'ai fait).
de ma réponse ici: https://stackoverflow.com/a/11451916/406592
sur mon serveur linux (pas vrai sur mon Mac dev local), les répertoires sont ignorés tant que je n'ajoute pas d'astérisque:
www / archives / *
Je ne sais pas pourquoi mais ça m'a fait perdre quelques heures, alors j'ai voulu partager...
une chose à garder à l'esprit si .gitignore
ne semble pas ignorer les fichiers non tracés est que vous ne devriez pas avoir de commentaires sur la même ligne que les ignorants. Donc c'est bon
# ignore all foo.txt, foo.markdown, foo.dat, etc.
foo*
mais cela ne marchera pas:
foo* # ignore all foo.txt, foo.markdown, foo.dat, etc.
.gitignore
interprète ce dernier cas comme" Ignorer les fichiers nommés "foo* # ignore all foo.txt, foo.markdown, foo.dat, etc."
, ce que, bien sûr, vous n'avez pas.
si vous devez arrêter de suivre un grand nombre de fichiers ignorés, vous pouvez combiner certaines commandes:
git ls-files -i --exclude-standard | xargs -L1 git rm --cached
cela arrêterait de suivre les fichiers ignorés. Si vous voulez réellement supprimer des fichiers du système de fichiers, n'utilisez pas l'option --cached
. Vous pouvez également spécifier un dossier pour limiter la recherche, tels que:
git ls-files -i --exclude-standard -- ${FOLDER} | xargs -L1 git rm