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?

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

Réponses:

202

Ah! Je veux simplement:

git update-index --no-skip-worktree <file>
Kevin Burke
la source
8
J'adore le Aha!
Ruto Collins
1
who
woulda thunk
1
Ah! = Eurika! : D
Daut
J'aurais pu inventer ça!
Tom Padilla
Pourquoi la meilleure réponse en bas de page
Carl Kroeger Ihl
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!

Stefan Anca
la source
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
C0DEF52
la source
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)
eXavier
la source
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
utilisateur276648
la source
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'
yossico
la source
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.

Bojidar Stanchev
la source