Annulla git update-index --skip-worktree


148

Qualche tempo fa l'ho fatto per ignorare le modifiche a un file monitorato da git:

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

Ora in realtà voglio eseguire il commit delle modifiche a quel file alla fonte. Come annullare gli effetti di skip-worktree?


11
Sono anche interessato a come ottenere un elenco di file nello stato 'skip-worktree'?
troex,

Risposte:



35

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

git ls-files -v

per vedere i file "assume invariato" e "skip-worktree" contrassegnati con una lettera speciale. I file "skip-worktree" sono contrassegnati con S.

Modifica : Come accennato da @amacleod , creare un alias per elencare tutti i file nascosti è un bel trucco da fare in modo da non doverlo ricordare. Uso alias hidden="git ls-files -v | grep '^S'"nel mio .bash_profile. Funziona benissimo!


9
Neat. Posso usare git ls-files -v | grep '^S'per elencare solo i file che ho "nascosto" con skip-worktree. Speravo di rendere un alias "nascosto" per quel comando, ma non sembrava funzionare l'inserimento di un reindirizzamento di pipe nell'alias.
amacleod,

5
@amacleod usa a !. Come questo [alias] ignored = !git ls-files -v | grep "^S"testato, funziona.
Steven Lu,

@amacleod Non pensi che saresti in grado di suggerire un comando alternativo per Windows?
Steve Chambers,

1
@SteveChambers, a corto di installazione grep, non lo so. Dipende dalla tua conchiglia, immagino. grepPenso che Git Bash arrivi .
amacleod,

1
Fantastico, grazie @amacleod - semplicemente non era sulla mia strada. L'unica cosa che dovevo cambiare per funzionare su Windows era lo stile delle virgolette - 'non funzionava ma funzionava ", cioègit ls-files -v | grep "^S"
Steve Chambers

17

Se si desidera annullare tutti i file applicati, ignorare worktree, è possibile utilizzare il comando seguente:

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 stamperà tutti i file con il loro stato
  2. grep -i ^S filtrerà i file e selezionerà solo salta worktree (S) o salta worktree e assume invariati (s), -i significa ignora la distinzione tra maiuscole e minuscole
  3. cut -c 3- rimuoverà lo stato e lascerà solo i percorsi, tagliando dal terzo carattere alla fine
  4. tr '\012' '\000' sostituirà il carattere di fine riga (\ 012) con zero (\ 000)
  5. xargs -0 git update-index --no-skip-worktreepasserà tutti i percorsi separati da zero git update-index --no-skip-worktreeper annullare

1
Questa è la risposta migliore
Dev

Questa risposta è oro puro!
Yossico,

7

Basato sulla risposta di @ GuidC0DE, ecco una versione per Powershell (utilizzo posh-git )

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

E come riferimento anche il comando opposto per nascondere i file:

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

3

Per quelli che usano Tortoise Git:

  1. Fare clic con il tasto destro sulla cartella o sul file specifico, quindi scegliere TortoiseGit > Check for modifications
  2. Controlla solo Show ignore local changes flagged files. Dovresti vedere il file che hai ignorato (o tutti i file che hai ignorato, se hai fatto clic con il tasto destro sulla cartella)
  3. Fare clic con il tasto destro sul file e scegliere Unflag as skip-worktree and assume-unchanged

3

Per tutti coloro che amano gli alias Bash, ecco il mio set per domarli tutti (basato su 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

Questa risposta è rivolta a meno tecnici che utilizzano Windows.

Se non ricordi / sai su quali file hai fatto clic su "skip-worktree", usa:

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".

Per risolvere il tuo problema:

Puoi andare ai file -> tasto destro -> ripristina a una versione precedente -> fai clic sulla scheda "git" in alto -> deseleziona la casella di controllo "skip-worktree" -> fai clic su "Applica" in fondo.

Se i file sono troppi per essere risolti a mano, dovrai fare riferimento alle altre risposte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.