Annuler git update-index --skip-worktree


148

Il y a quelque temps, j'ai fait cela pour ignorer les modifications apportées à un fichier suivi par git:

git update-index --skip-worktree <file>

Maintenant, je veux réellement valider les modifications de ce fichier dans la source. Comment annuler les effets de skip-worktree?


11
Je suis également intéressé par la façon d'obtenir la liste des fichiers dans l'état «skip-worktree»?
troex

Réponses:



35

Selon http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html , utilisez

git ls-files -v

pour voir les fichiers "supposer inchangé" et "skip-worktree" marqués d'une lettre spéciale. Les fichiers "skip-worktree" sont signalés par S.

Edit : Comme @amacleod l'a mentionné, créer un alias pour lister tous les fichiers cachés est une bonne astuce à avoir pour que vous n'ayez pas besoin de vous en souvenir. J'utilise alias hidden="git ls-files -v | grep '^S'"dans mon .bash_profile. Cela fonctionne très bien!


9
Soigné. Je peux utiliser git ls-files -v | grep '^S'pour lister uniquement les fichiers que j'ai "cachés" avec skip-worktree. J'espérais faire un alias "caché" pour cette commande, mais mettre une redirection de tube dans l'alias ne semblait pas fonctionner.
amacleod

5
@amacleod utilise un fichier !. Comme cela [alias] ignored = !git ls-files -v | grep "^S"testé, fonctionne.
Steven Lu

@amacleod Vous ne pensez pas pouvoir proposer une commande alternative pour Windows?
Steve Chambers

1
@SteveChambers, à court d'installation grep, je ne sais pas. Cela dépend de votre coquille, je suppose. Git Bash vient avec grep, je pense.
amacleod

1
Génial, merci @amacleod - n'était tout simplement pas sur mon chemin. La seule chose que j'avais besoin de changer pour que cela fonctionne sur Windows était le style de citation - 'n'a pas fonctionné mais "a fonctionné, c'estgit ls-files -v | grep "^S"
Steve Chambers

17

Si vous souhaitez annuler tous les fichiers qui ont été appliqués ignorer l'arbre de travail, vous pouvez utiliser la commande suivante:

git ls-files -v | grep -i ^S | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree
  1. git ls-files -v imprimera tous les fichiers avec leur état
  2. grep -i ^S filtrera les fichiers et sélectionnera uniquement ignorer l'arbre de travail (S) ou ignorer l'arbre de travail et supposera inchangé (s), -i signifie ignorer la casse
  3. cut -c 3- supprimera le statut et ne laissera que les chemins, en passant du 3ème caractère à la fin
  4. tr '\012' '\000' remplacera le caractère de fin de ligne (\ 012) par le caractère zéro (\ 000)
  5. xargs -0 git update-index --no-skip-worktreepassera tous les chemins séparés par zéro caractère à git update-index --no-skip-worktreepour annuler

1
C'est la meilleure réponse
Dev

Cette réponse est de l'or pur!
yossico

7

Basé sur la réponse @ GuidC0DE, voici une version pour Powershell (j'utilise posh-git )

git update-index --no-skip-worktree $(git ls-files -v | sls -pattern "^S"| %{$_.Line.Substring(2)})

Et pour référence également la commande inverse pour masquer les fichiers:

git update-index --skip-worktree $(git ls-files --modified)

3

Pour ceux qui utilisent Tortoise Git:

  1. Faites un clic droit sur le dossier ou sur le fichier spécifique, puis choisissez TortoiseGit > Check for modifications
  2. Vérifiez seulement Show ignore local changes flagged files. Vous devriez voir le fichier que vous avez ignoré (ou tous les fichiers que vous avez ignorés, si vous avez fait un clic droit sur le dossier)
  3. Faites un clic droit sur le fichier et choisissez Unflag as skip-worktree and assume-unchanged

3

Pour tous ceux qui aiment les alias Bash, voici mon ensemble pour les gouverner tous (basé sur C0DEF52)

alias gitskip='git update-index --skip-worktree ' #path to file(s)
alias gitlistskiped='git ls-files -v | grep ^S'
alias gitunskip='git update-index --no-skip-worktree ' #path to file(s)
alias gitunskipall='git ls-files -v | grep -i ^S | cut -c 3- | tr ''\\012'' ''\\000'' | xargs -0 git update-index --no-skip-worktree'

0

Cette réponse s'adresse aux personnes moins techniques utilisant Windows.

Si vous ne savez pas sur quels fichiers vous avez cliqué sur "skip-worktree", utilisez:

git ls-files -v             //This will list all files, you are looking for the ones with an S at the beginning of the line. 

git ls-files -v | grep "S " //Use this to show only the lines of interest. Those are the files that have "skip-worktree".

Pour résoudre votre problème:

Vous pouvez aller dans les fichiers -> clic droit -> restaurer à une version précédente -> cliquer sur l'onglet "git" en haut -> décocher la case "skip-worktree" -> cliquer sur "Appliquer" en bas.

Si les fichiers sont trop nombreux pour être corrigés à la main, vous devrez vous référer aux autres réponses.

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.