Comment arrêter de suivre et ignorer les changements dans un fichier GIT?

j'ai cloné un projet qui comprend quelques fichiers .csproj . Je n'ai pas besoin/comme mes fichiers locaux csproj suivis par Git (ou mis en place lors de la création d'un patch), mais il est clair qu'ils sont nécessaires dans le projet.

j'ai ajouté *.csproj à mon LOCAL .gitignore , mais les fichiers sont déjà dans le repo.

quand je tape git status, il affiche mes modifications à csproj que je ne suis pas intéressé à suivre ou Soumettre pour les correctifs.

Comment puis-je supprimer le "tracking" de ces fichiers de mon repo personnel (mais les garder dans la source afin que je puisse les utiliser) de sorte que je ne vois pas les changements lorsque je fais un État (ou créer un patch)?

y a-t-il une façon correcte / canonique de gérer cette situation?

1460
git
demandé sur Rishabh 2009-06-01 23:08:16

15 réponses

juste appeler git rm --cached sur chacun des fichiers que vous voulez supprimer du contrôle de révision devrait être très bien. Aussi longtemps que vos modèles d'ignorer locaux sont corrects, vous ne verrez pas ces fichiers inclus dans la sortie du statut git.

notez que cette solution supprime les fichiers du dépôt, de sorte que tous les développeurs auraient besoin de maintenir leurs propres copies locales (non contrôlées par révision) du fichier

pour éviter que git ne détecte des changements dans ces vous devez également utiliser cette commande:

git update-index --assume-unchanged [path]

Ce que vous voulez probablement faire: (ci-dessous @Ryan Taylor réponse )

  1. c'est pour dire à git que vous voulez votre propre version indépendante du fichier ou du dossier. Par exemple, vous ne voulez pas écraser (ou supprimer) production / mise en scène de fichiers de configuration.

git update-index --skip-worktree <path-name>

la réponse complète est ici dans cette URL: http://source.kohlerville.com/2009/02/untrack-files-in-git /

1826
répondu anthony 2017-08-23 12:28:13

si vous faites git update-index --assume-unchanged file.csproj , git ne vérifiera pas le fichier.csproj pour les changements automatiquement: cela les empêchera d'apparaître en état git chaque fois que vous les changez. Pour que tu puisses marquer tout ton .les fichiers csproj de cette façon - bien que vous devrez marquer manuellement tous les nouveaux fichiers que le repo amont vous envoie. (Si vous les avez dans votre .gitignore ou .git/info/exclude , alors ceux que vous créez seront ignorés)

Je ne suis pas sûr de quoi .les fichiers csproj le sont... s'ils sont quelque chose le long les lignes de configurations IDE (similaires à celles D'Eclipse .eclipse et .classpath files) alors je suggérerais qu'ils ne devraient tout simplement jamais être contrôlés par les sources. D'un autre côté, s'ils font partie du système de construction (comme les Makefiles), alors ils devraient clairement--- et un moyen de récupérer les changements locaux optionnels (par exemple à partir d'un local.csproj à la config.mk) serait utile: diviser l'accumulation dans les pièces et les priorités locales.

226
répondu araqnid 2012-02-15 16:08:40

il s'agit d'un processus en deux étapes:

  1. supprimer le suivi du fichier / dossier-mais les garder sur le disque-en utilisant

    git rm --cached 
    

    Maintenant, ils n'apparaissent pas comme "modifié" mais toujours

        untracked files in  git status -u  
    
  2. les ajouter à .gitignore

135
répondu rjha94 2015-06-23 21:07:37

il y a 3 options, vous voulez probablement #3

1. cela gardera le fichier local pour vous, mais le supprimera pour n'importe qui d'autre quand ils tirent.

git rm --cached <file-name> ou git rm -r --cached <folder-name>

2. c'est pour l'optimisation, comme un dossier avec un grand nombre de fichiers, par exemple des SDK qui ne changeront probablement jamais. Il dit à git d'arrêter de vérifier cette énorme dossier à chaque fois pour des changements, localement, puisqu'il n'y en aura pas. L'index assume-unchanged sera réinitialisé et le(S) fichier (s) effacé (s) s'il y a des changements en amont dans le fichier/dossier (lorsque vous tirez).

git update-index --assume-unchanged <path-name>

3. c'est pour dire à git que vous voulez votre propre version indépendante du fichier ou du dossier. Par exemple, vous ne voulez pas écraser (ou supprimer) les fichiers de config de production/mise en scène.

git update-index --skip-worktree <path-name>

il est important de savoir que git update-index ne propagera pas avec git, et chaque utilisateur devra l'exécuter indépendamment.

119
répondu Ryan Taylor 2018-10-02 17:40:39

Les accepté de répondre encore ne fonctionne pas pour moi

j'ai utilisé

git rm -r --mis en cache .

git add .

git commit-m" fixing .gitignore "

trouvé la réponse de ici

79
répondu Buddhika Hasthanayake 2014-09-18 05:44:44

a oublié votre .gitignore?

si vous avez le projet entier localement mais avez oublié d'ajouter vous git ignorer et sont maintenant la recherche de certains fichiers inutiles utiliser cette commande pour supprimer tout

git rm --cached -r .

assurez-vous que vous êtes à la racine du projet.

, Alors vous pouvez faire l'habituel

ajouter

git add .

Commit

git commit -m 'removed all and added with git ignore'

Push

git push origin master

Conclusion

espère que cela aidera les gens qui doivent faire des changements à leur .gitignore ou qui ont tout oublié ensemble.

  • il supprime la totalité du cache
  • regarde votre .gitignore
  • Ajoute les fichiers que vous voulez suivre""
  • Pousse à votre repo
38
répondu Joe Lloyd 2016-03-11 08:51:12

pour gagner du temps avec les règles que vous ajoutez .gitignore peut être utilisé pour supprimer plusieurs fichiers / dossiers, par exemple

git rm --cached app/**/*.xml

ou

git rm --cached -r app/widgets/yourfolder/

E. T. C.

20
répondu Peter 2013-11-07 13:18:52

comme indiqué dans d'autres réponses, la réponse choisie est erronée.

le la réponse à une autre question suggère qu'il pourrait être skip-worktree qui serait nécessaire.

git update-index --skip-worktree <file>
20
répondu the_new_mr 2017-05-23 11:54:41

beaucoup de gens vous conseillent d'utiliser git update-index --assume-unchanged . En effet, cela peut être une bonne solution, mais seulement à court terme.

Ce que vous voulez probablement faire est ceci: git update-index --skip-worktree .

(la troisième option, que vous ne voulez probablement pas, est: git rm --cached . Il gardera votre fichier local, mais marqué comme supprimé du référentiel distant.)

différence entre les deux premières options?

  • assume-unchanged est de vous permettre temporairement de cacher des modifications à partir d'un fichier. Si vous voulez cacher des modifications faites à un fichier, modifier le fichier, puis vérifier une autre branche, vous devrez utiliser no-assume-unchanged alors probablement cacher des modifications faites.
  • skip-worktree vous suivra quelle que soit la branche que vous achetez, avec vos modifications!

"1519190920 cas d'Utilisation" de assume-unchanged

il suppose que ce fichier ne doit pas être modifié, et vous donne une sortie plus propre en faisant git status . Mais lors de la vérification à une autre branche, vous devez réinitialiser le drapeau et commettre ou cacher des changements avant ainsi. Si vous tirez avec cette option activée, vous aurez besoin de résoudre les conflits et git ne sera pas auto fusionner. Il ne cache en fait que des modifications ( git status ne vous montrera pas les fichiers marqués).

j'aime l'utiliser quand je veux seulement pour arrêter le suivi des modifications pendant un certain temps + commit un tas de fichiers ( git commit -a ) liés à la modification même .

cas D'utilisation de skip-worktree

vous avez une classe DE setup contenant des paramètres (par ex. y compris les mots de passe) que vos amis doivent changer en fonction de leur configuration.

  • 1: créez une première version de cette classe, remplissez les champs que vous pouvez remplir et laissez les autres vide ou nulle.
  • 2: s'Engager et de les pousser vers le serveur distant.
  • 3: git update-index --skip-worktree MySetupClass.java
  • 4: Mettez à jour votre classe de configuration avec vos propres paramètres.
  • 5: retournez travailler sur une autre fonctionnalité.

les modifications que vous faites vous suivront quelle que soit la branche. Avertissement: si vos amis veulent aussi modifier cette classe, ils ont le même setup, sinon leurs modifications seraient repoussées vers le dépôt distant. En tirant, la version distante du fichier devrait écraser la vôtre.

PS: faites l'un ou l'autre, mais pas les deux, car vous aurez des effets secondaires indésirables. Si vous voulez essayer un autre drapeau, vous devez désactiver ce dernier en premier.

5
répondu belka 2018-09-17 16:25:06

pour empêcher la surveillance d'un fichier par git

git update-index --assume-unchanged [file-path]

et de revenir à l'utilisation

git update-index --no-assume-unchanged [file-path]
3
répondu shijin 2017-04-18 09:41:40

pour dire à Git de ne pas suivre les modifications de votre fichier/dossier local (ce qui signifie que le statut git ne détectera pas les modifications), faites:

git update-index --skip-worktree path/to/file

et pour dire à Git de suivre les modifications à votre version locale une fois de plus (pour que vous puissiez les propager), faites:

git update-index --no-skip-worktree path/to/file
3
répondu Ruto Collins 2018-06-12 22:10:25

je suppose que vous demandez comment supprimer tous les fichiers dans un dossier spécifique ou le dossier bin, plutôt que de sélectionner chaque fichiers séparément.

Vous pouvez utiliser cette commande:



git rm -r -f /<floder-name>\*



Assurez-vous que vous êtes dans le répertoire parent du répertoire.

Cette commande va, récursivement "supprimer" tous les fichiers qui sont dans le bac/ ou créer/ dossiers. Par le mot supprimer, je veux dire que git prétendre que ces fichiers sont "supprimés" et que ces fichiers ne seront pas suivis. Le git marque vraiment ces fichiers pour être en mode suppression.

assurez-vous que vous avez votre .gitignore prêt pour les prochaines commits.

Documentation: git rm

0
répondu Vraj Pandya 2015-04-06 13:47:02

Le problème peut être causé par l'ordre de fonctionnement. Si vous avez modifié l' .gitignore d'abord, puis git rm --cached xxx,vous pouvez continuer à rencontrer ce problème.

solution Correcte:

  1. git rm --cached xxx
  2. modifié le .gitignore

ordre invariant!

The .gitignore recharger après modification!

0
répondu thearyong 2017-03-24 17:05:36

je suppose que vous essayez de supprimer un seul fichier de Git tacking. pour cela, je recommande le sous-commandement.

git update-index --Assumption-unchanged

Ex-git update-index --assume-unchanged .gitignore .idée/compilateur.xml

0
répondu Pankaj Sonani 2017-04-04 17:04:12

Pour ignorer les modifications à tous les fichiers (d'un certain type) dans un répertoire, j'ai eu de combiner certaines de ces approches, sinon les fichiers ont été créés s'ils n'avaient pas auparavant.

dans ce qui suit," excludedir " est le nom du répertoire que je ne veux pas voir changer.

tout d'abord, supprimez tous les nouveaux fichiers existants de votre cache de suivi des modifications (sans les supprimer de votre système de fichiers).

git status | grep "new file:" | cut  --complement -d " " -f1-4 | grep "^excludedir" | xargs git rm --cache

vous pouvez faire la même chose avec modified: . renamed: est un peu plus compliqué, car vous devrez regarder le bit post -> pour le nouveau nom de fichier, et faire le bit pre -> comme décrit pour deleted: ci-dessous.

deleted: les fichiers se révèlent un peu plus compliqués, car vous ne semblez pas pouvoir mettre à jour-index pour un fichier qui n'existe pas sur le système local

echo .deletedfiles >> .gitignore
git status | grep "deleted:" | cut  --complement -d " " -f1-4 | grep "^excludedir" > .deletedfiles
cat .deletedfiles | xargs -d '\n' touch
cat .deletedfiles | xargs -d '\n' git add -f
cat .deletedfiles | xargs -d '\n' git update-index --assume-unchanged
cat .deletedfiles | xargs -d '\n' rm

la dernière commande dans la liste ci-dessus supprimera de nouveau les fichiers de votre système de fichiers, donc n'hésitez pas à omettre.

alors, bloquez le suivi des changements de ce répertoire

git ls-files excludedir/ | xargs git update-index --skip-worktree
git update index --skip-worktree excludedir/
0
répondu mpag 2018-05-26 00:05:11