2012-09-11 12 views
338

Dire che ho un file nel mio repository git chiamato foo.Staging Deleted files

Supponiamo che sia stato eliminato con rm (non git rm). Quindi lo stato git mostrerà:

Changes not staged for commit: 

    deleted: foo 

Come si esegue questa eliminazione di singoli file?

se provo:

git add foo 

Dice:

'foo' did not match any files. 
+1

Si è verificato un problema nelle vecchie versioni Git? Al giorno d'oggi non sembra essere uno, funziona in modo simile ai file modificati. – cst1992

risposta

375

Usa git rm foo mettere in scena la lima per l'eliminazione. (Questo cancellerà anche il file dal file system, se non è stato cancellato in precedenza. Naturalmente, può essere ripristinato da git, poiché è stato precedentemente archiviato.)

Per eseguire il file per la cancellazione senza cancellarlo dal file system, utilizzare git rm --cached foo

+8

Inoltre è possibile aggiungere il flag '--cache' per rimuovere il file solo dal repository e lasciare inalterato il file system. – Hauleth

+0

Quale sarebbe il processo per annullare questa operazione, ovvero, annullare la fase di eliminazione del file? È possibile? – longda

+0

Ho appena risposto alla mia domanda ... git reset HEAD seguito da un checkout git sembra fare il trucco! – longda

307

Si potrebbe fare git add -u.

Questo sarebbe di aiuto se si desidera eliminare più file, senza eseguire git rm per ognuno di essi.

+35

Sì 'git add -A .' aggiungerà tutte le modifiche, in particolare ho voluto mettere in scena un file cancellato. –

+8

Questo aggiungerà tutti i file modificati; Non solo file cancellati. – Foreever

+3

Questo è corretto. In particolare, metterà in scena tutte le modifiche nei file già tracciati, eliminati o modificati. Ciò aiuta quando si eliminano più file e non si desidera eseguirli singolarmente. – Sailesh

6

È possibile utilizzare

git rm -r --cached -- "path/to/directory"

mettere in scena una directory eliminata.

21

per aggiungere tutti i file eliminati pronti

git status -s | grep -E '^ D' | cut -d ' ' -f3 | xargs git add --all 

controllo ringraziamento per assicurarsi

git status 

si dovrebbe essere pronti per partire

+2

Confermando che questo funziona. Penso che la lezione qui sia quella di non fare 'rm ', ma piuttosto 'git rm ' – DanGordon

+0

Questo funziona come fantastico. Grazie uomo :). –

+0

FYI: il taglio sugli spazi causa problemi se qualche percorso ha spazi in loro – davis

90

Per mettere in scena tutti i file eliminati manualmente è possibile utilizzare:

git rm $(git ls-files --deleted) 

Per aggiungere un alias per questo comando come git rm-deleted, eseguire:

git config --global alias.rm-deleted '!git rm $(git ls-files --deleted)' 
+2

la notazione $() non esiste nella console di Windows bash, che porta a 'opzione sconosciuta \' cancellata) ' –

+1

Non penso che funzioni se ci sono degli spazi nel percorso. Almeno, non sul mio sistema (con zsh). –

+2

ha funzionato perfettamente per me! Ho fatto esattamente quello di cui avevo bisogno. GRANDE apprezzamento qui! – RedSands

1

Dal Git 2.0.0, git add sarà anche in scena le eliminazioni di file.

Git 2.0.0 Docs - git-add

< pathspec> ...

file da aggiungere contenuti da. Fileglobs (ad es. * .c) può essere fornito per aggiungere tutti i file corrispondenti. Può anche essere dato un nome di directory principale (ad es. Dir per aggiungere dir/file1 e dir/file2) per aggiornare l'indice in modo che corrisponda allo stato corrente della directory nel suo complesso (ad es. Specificando dir si registrerà non solo un file dir/file1 modificato nell'albero di lavoro, un file dir/file2 aggiunto all'albero di lavoro, ma anche un file dir/file3 rimosso dall'albero di lavoro.Si noti che le versioni precedenti di Git erano solite ignorare i file rimossi; usa l'opzione --no-all se vuoi aggiungere file modificati o nuovi ma ignora quelli rimossi.