Annuler git update-index --assume-unchanged <fichier>


464

La façon dont vous Git ignorez regarder / suivre un répertoire / fichier particulier. vous exécutez simplement ceci:

git update-index --assume-unchanged <file>

Maintenant, comment pouvez-vous l'annuler pour qu'ils soient à nouveau regardés? (Appelons cela un-assumer.)


5
Juste une note pour dire qu'il semble que skip-worktree est probablement ce que vous feriez mieux d'utiliser que supposé inchangé, à moins que les performances de git ne soient votre problème. stackoverflow.com/questions/13630849/…
GreenAsJade

Réponses:


588

Pour obtenir annuler / afficher les répertoires / fichiers qui sont définis pour supposer inchangés, exécutez ceci :

git update-index --no-assume-unchanged <file>

Pour obtenir une liste des répertoires / fichiers assume-unchangedexécutés, procédez comme suit :

git ls-files -v|grep '^h'


7
Amélioration mineure de votre instruction grep, elle pourrait utiliser '^ [az]' pour intercepter tous les fichiers ignorés, car la première balise de lettre pourrait être des lettres autres que 'H' / 'h'. Depuis git-scm.com/docs/git-ls-files : Cette option identifie l'état du fichier avec les balises suivantes (suivies d'un espace) au début de chaque ligne: H :: cached S :: skip-worktree M: : non fusionné R :: supprimé / supprimé C :: modifié / changé K :: à tuer? :: autre
Bdoserror

8
Une autre astuce utile est git ls-files -v|grep '^h'|cut -c3-, qui vous donnera juste les noms de fichiers, sans le préfixe "h".
Retsam

9
Si vous ne connaissez plus les fichiers que vous assume-unchangedutilisez, utilisez-les git update-index --really-refresh. Avec cette commande, vous n'avez pas besoin de rechercher d'abord les fichiers git ls-files.
theDmi

103

S'il s'agit d'une commande que vous utilisez souvent, vous pouvez également envisager d'avoir un alias. Ajoutez à votre global .gitconfig:

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged

Comment définir un alias (si vous ne le savez pas déjà):

git config --configLocation alias.aliasName 'command --options'

Exemple:

git config --global alias.hide 'update-index --assume-unchanged'
git config... etc

Après avoir enregistré cela dans votre .gitconfig, vous pouvez exécuter une commande plus propre.

git hide myfile.ext

ou

git unhide myfile.ext

Cette documentation git a été très utile.

Selon les commentaires, c'est aussi un alias utile pour savoir quels fichiers sont actuellement cachés:

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-

2
Cet alias est également utile:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

42

La fonction git update-index a plusieurs options que vous pouvez trouver en tapant comme ci-dessous:

git update-index --help

Vous trouverez ici diverses options - comment gérer avec la fonction update-index.

[si vous ne connaissez pas le nom du fichier]

git update-index --really-refresh 

[si vous connaissez le nom du fichier]

git update-index --no-assume-unchanged <file>

rétablira tous les fichiers qui ont été ajoutés dans la liste des ignorés.

git update-index --assume-unchanged <file>

git update-index --really-refresh, annuler tous les supposés inchangés que j'ai faits, merci pour le conseil
Sérgio

git update-index --no-assume-unchanged <file>m'a sauvé la vie .. ok, je pouvais à nouveau synchroniser le dossier, mais je voulais une "vraie" solution à ce problème.
Cagatay Ulubay,

38

Je suppose (heh) que vous vouliez dire --assume-unchanged, car je ne vois aucune --assume-changedoption. L'inverse de --assume-unchangedest --no-assume-unchanged.


32

Pour synthétiser les excellentes réponses originales de @adardesign, @adswebwork et @AnkitVishwakarma, et les commentaires de @Bdoserror, @Retsam, @seanf et @torek, avec des liens de documentation supplémentaires et des alias concis ...

Commandes de base

Pour réinitialiser un fichier qui est supposé inchangé revenir à la normale:

git update-index --no-assume-unchanged <file>

Pour répertorier tous les fichiers inchangés:

git ls-files -v | grep '^[a-z]' | cut -c3-

Pour réinitialiser tous les fichiers inchangés à la normale:

git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --

Remarque: Cette commande qui a été répertoriée ailleurs ne semble plus réinitialiser tous les fichiers inchangés (je crois qu'elle l'a utilisée et l'a précédemment répertoriée comme solution):

git update-index --really-refresh

Raccourcis

Pour rendre ces tâches courantes faciles à exécuter dans git, ajoutez / mettez à jour la section d' alias suivante .gitconfigpour votre utilisateur (par exemple ~/.gitconfigsur un système * nix ou macOS):

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged
    unhide-all = ! git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --
    hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-

1
Pour git hidden, vous pouvez obtenir le même effet sans alias ni scripts shell, en utilisant !comme ceci:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

1
--really-refreshne supprime pas (ou ne supprime plus, peut-être une fois) les indicateurs supposés inchangés des fichiers d'index.
torek

Merci, @torek! J'ai confirmé le comportement que vous avez décrit et j'ai mis à jour la réponse avec une solution différente au cas «réinitialiser tout».
Will Cain

20

Si vous souhaitez annuler tous les fichiers qui ont été appliqués supposent inchangés avec n'importe quel état, non seulement mis en cache (git les marque par caractère en minuscules), vous pouvez utiliser la commande suivante:

git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
  1. git ls-files -v imprimera tous les fichiers avec leur statut
  2. grep '^[a-z]' filtrera les fichiers et sélectionnera seulement supposé inchangé
  3. cut -c 3- supprimera le statut et ne laissera que des chemins, coupant du 3ème caractère à la fin
  4. tr '\012' '\000' remplacera le caractère de fin de ligne (\ 012) par un caractère nul (\ 000)
  5. xargs -0 git update-index --no-assume-unchangedpassera tous les chemins séparés par un caractère zéro git update-index --no-assume-unchangedpour annuler

C'est tellement utile. Merci pour les informations détaillées!
Chamithra Thenuwara

11

Pour ajouter à @adardesignla réponse de, si vous souhaitez réinitialiser tous les fichiers qui ont été ajoutés à la assume-unchangedliste no-assume-unchangeden une seule fois, vous pouvez effectuer les opérations suivantes:

git ls-files -v | grep '^h' | sed 's/^..//' | sed 's/\ /\\ /g' | xargs -I FILE git update-index --no-assume-unchanged FILE || true

Cela supprimera simplement les deux caractères sortis de grep, c'est-à "h "- dire , échappera à tous les espaces qui peuvent être présents dans les noms de fichiers, et || trueempêchera finalement la commande de se terminer prématurément au cas où certains fichiers de la boucle contiennent des erreurs.


4

Si vous utilisez des extensions Git , suivez les étapes ci-dessous:

  1. Accédez à la fenêtre de validation.
  2. Cliquez sur la liste déroulante nommée Modifications du répertoire de travail .
  3. Sélectionnez l'option Afficher les fichiers sans modification .
  4. Faites un clic droit sur le fichier que vous souhaitez supprimer.
  5. Sélectionnez Ne pas assumer inchangé .

Vous avez terminé.


0

Rien ici qui n'est pas couvert. Mais j'aimerais ajouter mes 2 cents. Parfois, je lance une build et cela change beaucoup de fichiers, puis je veux travailler sur quelque chose, donc cette commande m'aide beaucoup.

git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`

J'espère que quelqu'un d'autre le trouvera également utile.


Je pense que vous gagneriez à utiliser .gitignorepour ignorer vos artefacts de construction.
Nick

1
Je l'ai, .gitignoremais c'est parfois, selon mon expérience ne suffit pas. Mais je comprends le contexte dans lequel vous dites cela.
Tyagi Akhilesh

0

Aucune des solutions n'a fonctionné pour moi dans Windows - il semble utiliser des majuscules Hplutôt que hpour l'état du fichier et la commande grep nécessite un caret supplémentaire car^ représente également le début de la ligne ainsi que la négation du caractère suivant.

Solution Windows

  1. Ouvrez Git Bash et accédez au répertoire de niveau supérieur correspondant.
  2. git ls-files -v | grep '^^H' pour répertorier tous les fichiers non mis en cache
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree pour annuler les fichiers en ignorant tous les fichiers qui ont été effectués via update-index --skip-worktree
  4. git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged pour annuler les fichiers en ignorant tous les fichiers qui ont été effectués via update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' pour répertorier à nouveau tous les fichiers non mis en cache et vérifier si les commandes ci-dessus ont fonctionné - cela ne devrait plus rien retourner

-1

Si vous utilisez eclipse, vous trouverez peut-être utiles les éléments suivants:

pas supposé inchangé avec éclipse


1
pourquoi les downvotes s'il vous plait?
Antonio
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.