Annulla git update-index --assume-invariato <file>


464

Il modo in cui Git ignora la visione / il monitoraggio di un determinato dir / file. hai appena eseguito questo:

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

Ora come si fa a annullarlo in modo che vengano guardati di nuovo? (Chiamiamolo un-assume).


5
Solo una nota per dire che sembra che skip-worktree sia con ogni probabilità ciò che sarebbe meglio usare che assumere invariato, a meno che le prestazioni di git non siano il tuo problema. stackoverflow.com/questions/13630849/...
GreenAsJade

Risposte:


588

Per ottenere annulla / mostra i file / dir impostati su assume invariato, esegui questo :

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

Per ottenere un elenco di dir / file che assume-unchangedeseguono questo :

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


7
Miglioramento minore dell'istruzione grep, potrebbe usare '^ [az]' per catturare tutti i file ignorati, poiché il tag della prima lettera potrebbe essere lettere diverse da 'H' / 'h'. Da git-scm.com/docs/git-ls-files : questa opzione identifica lo stato del file con i seguenti tag (seguiti da uno spazio) all'inizio di ogni riga: H :: cache S :: skip-worktree M: : non fuso R :: rimosso / eliminato C :: modificato / cambiato K :: da uccidere? :: altro
Bdoserror

8
Un altro trucco utile è git ls-files -v|grep '^h'|cut -c3-, che ti darà solo i nomi dei file, senza il prefisso "h".
Retsam,

9
Se non conosci più i file che assume-unchangedusi, basta usare git update-index --really-refresh. Con quel comando, non è necessario cercare git ls-filesprima i file .
theDmi

103

Se questo è un comando che usi spesso, potresti prendere in considerazione l'idea di avere anche un alias. Aggiungi al tuo globale .gitconfig:

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

Come impostare un alias (se non lo sai già):

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

Esempio:

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

Dopo .gitconfigaverlo salvato sul tuo , puoi eseguire un comando più pulito.

git hide myfile.ext

o

git unhide myfile.ext

Questa documentazione git è stata molto utile.

Come da commenti, questo è anche un utile alias per scoprire quali file sono attualmente nascosti:

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

2
Anche questo alias è utile:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

42

La funzione git update-index ha diverse opzioni che puoi trovare digitando di seguito:

git update-index --help

Qui troverai varie opzioni: come gestirle con la funzione update-index.

[se non conosci il nome del file]

git update-index --really-refresh 

[se conosci il nome del file]

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

ripristinerà tutti i file che sono stati aggiunti nell'elenco ignora.

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

git update-index - davvero-aggiorna, annulla tutto suppongo invariato che io abbia fatto, grazie per la punta
Sérgio

git update-index --no-assume-unchanged <file>mi ha salvato la vita .. ok, potrei solo sincronizzare di nuovo la cartella, ma volevo una soluzione "reale" per questo problema.
Cagatay Ulubay,

38

Presumo (eh) intendevi dire --assume-unchanged, dal momento che non vedo alcuna --assume-changedopzione. L'inverso di --assume-unchangedè --no-assume-unchanged.


32

Per sintetizzare le eccellenti risposte originali di @adardesign, @adswebwork e @AnkitVishwakarma e i commenti di @Bdoserror, @Retsam, @seanf e @torek, con collegamenti di documentazione aggiuntivi e alias concisi ...

Comandi di base

Per ripristinare un file che è rimasto invariato alla normalità:

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

Per elencare tutti i file che rimangono invariati:

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

Per ripristinare tutti i file presupposti invariati alla normalità:

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

Nota: questo comando che è stato elencato altrove non sembra più ripristinare tutti i file invariati (credo che l'abbia usato e precedentemente elencato come soluzione):

git update-index --really-refresh

Tasti di scelta rapida

Per semplificare l'esecuzione di queste attività comuni in git, aggiungi / aggiorna la seguente sezione alias.gitconfig per il tuo utente (ad es. ~/.gitconfigSu un sistema * nix o 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
Perché git hiddenpuoi ottenere lo stesso effetto senza alias o script di shell, usando in !questo modo:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

1
--really-refreshnon cancella (o non lo fa più, forse una volta) i flag assume invariati sui file di indice.
Torek,

Grazie @torek! Ho confermato il comportamento descritto e ho aggiornato la risposta con una soluzione diversa al caso "ripristina tutto".
Will Caino il

20

Se si desidera annullare tutti i file applicati assumere invariato con qualsiasi stato, non solo memorizzato nella cache (git li contrassegna per carattere in minuscolo), è possibile utilizzare il seguente comando:

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 stamperà tutti i file con il loro stato
  2. grep '^[a-z]' filtrerà i file e selezionerà solo presupposto invariato
  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-assume-unchangedpasserà tutti i percorsi separati da zero git update-index --no-assume-unchangedper annullare

Questo è così utile Grazie per le informazioni dettagliate!
Chamithra Thenuwara,

11

Aggiungendo alla @adardesignrisposta, se si desidera ripristinare tutti i file che sono stati aggiunti assume-unchangedall'elenco no-assume-unchangedin una volta sola, è possibile effettuare le seguenti operazioni:

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

Questo eliminerà semplicemente i due caratteri emessi da grep "h ", ad esempio , quindi sfuggirà a tutti gli spazi che potrebbero essere presenti nei nomi dei file e infine || trueimpedirà al comando di terminare prematuramente nel caso in cui alcuni file nel ciclo abbiano errori.


4

Se stai usando le estensioni Git , segui i passaggi seguenti:

  1. Vai alla finestra di commit.
  2. Fai clic sul menu a discesa denominato Modifiche alla directory di lavoro .
  3. Selezionare l' opzione Mostra file invariati invariati .
  4. Fare clic con il tasto destro del mouse sul file che si desidera annullare.
  5. Selezionare Non presupporre invariato .

Hai fatto.


0

Niente qui che non è coperto. Ma vorrei aggiungere i miei 2 centesimi. A volte, eseguo una build e cambia molti file e quindi voglio lavorare su qualcosa, quindi questo comando mi aiuta davvero molto.

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

Spero che qualcun altro lo trovi utile.


Penso che trarrai beneficio dall'uso .gitignoreper ignorare i tuoi manufatti di costruzione.
Nick,

1
Ho .gitignorema questo è a volte, nella mia esperienza non è sufficiente. Ma capisco il contesto in cui lo stai dicendo.
Tyagi Akhilesh,

0

Nessuna delle soluzioni ha funzionato per me in Windows: sembra usare maiuscole Hpiuttosto che hper lo stato del file e il comando grep richiede un punto di inserimento aggiuntivo in quanto ^rappresenta anche l'inizio della riga e nega il carattere successivo.

Soluzione Windows

  1. Apri Git Bash e passa alla directory di livello superiore pertinente.
  2. git ls-files -v | grep '^^H' per elencare tutti i file non memorizzati
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree per annullare il salto dei file di tutti i file eseguiti tramite 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 per annullare il salto dei file di tutti i file eseguiti tramite update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' per elencare nuovamente tutti i file non memorizzati nella cache e verificare se i comandi precedenti hanno funzionato - questo non dovrebbe restituire nulla

-1

Se stai usando eclipse potresti trovare utile quanto segue:

no assume invariato con l'eclissi


1
perché i voti negativi per favore?
Antonio,
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.