Staging dei file eliminati


499

Supponiamo di avere un file nel mio repository git chiamato foo.

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

Changes not staged for commit:

    deleted: foo

Come imposto l'eliminazione di questo singolo file?

Se provo:

git add foo

Dice:

'foo' did not match any files.

2
Era un problema nelle vecchie versioni di Git? Oggi non sembra essere uno, funziona in modo simile ai file modificati.
cst1992,

Risposte:


22

A partire da Git 2.0.0, git addverrà inoltre eseguita l'eliminazione dei file.

Documenti Git 2.0.0 - git-add

<pathspec> ...

File da cui aggiungere contenuti. Fileglobs (es. * .C) possono essere dati per aggiungere tutti i> file corrispondenti. Inoltre, è possibile assegnare 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 insieme (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. Nota che le versioni precedenti di Git usavano ignorare i file rimossi; usa l'opzione --no-all se desidera aggiungere file modificati o nuovi ma ignorare quelli rimossi.


La risposta accettata non risolve il problema - e gli altri sono più ingombranti da Git 2.0.0 - questo è il modo migliore! Hai il mio voto
João Antunes,

519

Utilizzare git rm fooper mettere in scena il file per l'eliminazione. (Ciò eliminerà anche il file dal file system, se non era stato precedentemente eliminato. Può, ovviamente, essere ripristinato da Git, dal momento che era stato precedentemente archiviato.)

Per mettere in scena il file per l'eliminazione senza eliminarlo dal file system, utilizzare git rm --cached foo


8
Inoltre è possibile aggiungere --cacheflag per rimuovere il file solo dal repository, lasciando intatto nel filesystem.
Hauleth,

Quale sarebbe il processo per annullare questa operazione, ovvero annullare la fase del file per l'eliminazione? È possibile?
Longda,

82
In realtà OP ha chiesto come mettere in scena il file già_eliminato e questo può essere fatto da git status | grep 'deleted:' | cut -d':' -f2 | xargs -t -I {} git add -u "{}". Altre risposte sembrano mostrare come organizzare correttamente la rimozione dei file (ma non come mettere in scena i file già eliminati). ps. il xargscomando basato funziona per me su Ubuntu 12.04, tuttavia quando lo faccio manualmente non git add -u deleted_file.txtfunziona. Il mio git è 1.7.9.5
Dimitry K

8
@DimitryK: git rmmetterà felicemente in scena un file per la cancellazione anche se è già stato cancellato dal filesystem. E come sottolinea il commento di OP su un'altra risposta, volevano mettere in scena un file specifico che era già stato eliminato.
Wooble,

3
git rmnon mette in scena file già rimossi. Si getta questo errore: fatal: pathspec '~.SLDASM' did not match any files. Ecco le schermate con prova: i.imgur.com/cKNKGGe.png i.imgur.com/1p9JdWF.png . Il primo screenshot mostra chiaramente che 2 file vengono eliminati e non messi in scena, il secondo screenshot mostra che quando git rm "~$Box.SLDASM"scrivo genera questo errore.
KulaGGin,

413

Anche se è corretto da usare git rm [FILE], in alternativa, potresti farlo git add -u.

Secondo la git-adddocumentazione:

-u: aggiornato

Aggiorna l'indice nel punto in cui ha già una voce corrispondente a [FILE]. Ciò rimuove e modifica le voci dell'indice in modo che corrispondano all'albero di lavoro, ma non aggiunge nuovi file.

Se non viene fornito [FILE] quando viene utilizzata l'opzione -u, vengono aggiornati tutti i file tracciati nell'intero albero di lavoro (le vecchie versioni di Git venivano utilizzate per limitare l'aggiornamento alla directory corrente e alle sue sottodirectory).

Su cui verrà aggiornato l'indice e i file verranno messi in scena correttamente.


56
git add -A ., aggiungerò tutte le modifiche, volevo specificamente mettere in scena un file eliminato.
Andrew Tomazos,

25
Ciò aggiungerà tutti i file modificati; Non solo file cancellati.
sempre il

3
È corretto. Più specificamente, metterà in scena tutte le modifiche nei file che sono già tracciati, siano essi eliminati o appena modificati. Questo aiuta quando si eliminano più file e non si desidera metterli in scena singolarmente.
Sailesh,

9
C'è un modo per mettere in scena solo i file eliminati e non modificati? Solo curioso.
Agosto

11
Ho fatto git add -u FolderWithDeletedFiles/e ha fatto quello che volevo, grazie
parlamento

158

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

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

Per aggiungere un alias a 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, portando aunknown option `deleted)
Félix Gagnon-Grenier,

2
Non penso che funzioni anche se hai spazi nel tuo percorso. Almeno, non funziona sul mio sistema (con zsh).
Wil Shipley,

3
Ha funzionato perfettamente per me! Ho fatto esattamente quello di cui avevo bisogno. Enorme apprezzamento qui!
RedSands

In windows dofor /F %I in ('git ls-files --deleted') do git add -u %I
eis,

3
questo non funziona per i nomi di file con spazi, 'git add -u' se necessario.
J-Dizzle,

33

per aggiungere tutti i file eliminati pronti

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

per favore controlla per essere sicuro

git status

dovresti essere bravo ad andare


5
Confermando che funziona. Penso che la lezione qui sia di non farerm <file> , ma piuttostogit rm <file>
DanGordon il

1
Cordiali saluti: tagliare gli spazi provoca problemi se alcuni percorsi hanno spazi al loro interno
davis

1
questo non funziona per i nomi di file con spazi, 'git add -u' se necessario.
J-Dizzle

Funziona perfettamente per me git version 2.15.2 (Apple Git-101.1).
Kalob Taulien

funziona perfettamente su console linux!
Ahmed AMMOURI,

8

Puoi usare

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

per mettere in scena una directory eliminata.



0

per coloro che usano git 2.x + in powershell:

foreach ($filePath in (git ls-files --deleted)) { git add "$filePath" }
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.