Rimozione di più file da un repository Git che sono già stati eliminati dal disco


1311

Ho un repository Git in cui ho eliminato quattro file dall'uso rm( non git rm ) e il mio stato Git è simile al seguente:

#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

Come rimuovo questi file da Git senza dover passare manualmente e aggiungere ogni file in questo modo:

git rm file1 file2 file3 file4

Idealmente, sto cercando qualcosa che funzioni allo stesso modo git add ., se possibile.



10
@seth, non è sempre comodo da usare git rm, la rimozione potrebbe essere stata da uno strumento separato, IDE o file manager. Visual Studio per uno può essere un problema quando si rimuovono / rinominano i file.
Brett Ryan,

67
Chiedere perché qualcuno non usa git rmè un po 'come chiedere perché non lo usano git vimo git cd. È una cosa stupida da fare e git dovrebbe avere un comando o un alias integrato per rimuovere i file cancellati dalla stadiazione e non dovresti cercare su SO o leggere le pagine man durante la pausa pranzo.
WCWedin

7
La risposta di Varinder non è un buon modo. Prendi in considerazione git add -u come suggerito da Cody e che è anche la risposta a questa domanda: stackoverflow.com/questions/1402776/…
Roland

Risposte:


2300

Per Git 1.x

$ git add -u

Questo dice a git di mettere in scena automaticamente i file tracciati, inclusa l'eliminazione dei file precedentemente tracciati.

Per Git 2.0

Per mettere in scena l'intero albero di lavoro:

$ git add -u :/

Per mettere in scena solo il percorso corrente:

$ git add -u .

133
Si noti che questo aggiungerà tutti i file modificati e tracciati, eliminati e aggiornati.
Ian Hunter,

19
@beanland, devi solo fornire il percorso del file specifico che vuoi modificare se non vuoi che li ottenga tutti. es. git add -u [percorso]
Paul Prewett,

27
anche git add -u folder/per eseguire questa operazione in una cartella
c.

2
FYI: questa risposta è fusa da stackoverflow.com/questions/1402776/...
Shog9

1
Potrebbe essere la domanda che le persone stavano ponendo quando sono arrivati ​​a questa pagina, e potrebbe essere quello che l'OP intendeva effettivamente porre, ma non risponde alla domanda esatta fatta.
Relequestual

1362
git ls-files --deleted -z | xargs -0 git rm 

potrebbe essere quello che stai cercando .. funziona per me ..


5
per windows prova ad aggiungere il seguente alias nella tua configurazione senza le virgolette come indicato sopra da Evan Moran 'remove =! git ls-files --deleted -z | xargs -0 git rm '
CLS

21
diffidare di file con spazi nel loro nome
maazza

44
@DaveEverittgit ls-files --deleted -z | xargs -0 git rm
Max Nanasy,

15
git add -u come suggerito da Cody è un modo molto più semplice e sicuro, senza il rischio di cancellare accidentalmente i file.
Roland,

4
Downvoting questo in quanto è la risposta sbagliata anche se potrebbe funzionare per alcuni file. usa "git add -u" di seguito. Ecco a cosa serve.
13

733

Puoi usare

git add -u

Per aggiungere i file eliminati nell'area di gestione temporanea, quindi eseguirne il commit

git commit -m "Deleted files manually"

101
Nota l'utente di Google: aggiunge i file tracciati modificati anche nell'area di gestione temporanea.
Erenon,

4
Esegui questo comando solo se hai appena rimosso i file e desideri metterli in scena immediatamente.
Aryo,

1
non riesco a rimuovere il file dal repo bitbucket]
srinivas gowda,

356

Se corri semplicemente:

git add -u

git aggiornerà il suo indice per sapere che i file che hai eliminato dovrebbero effettivamente far parte del prossimo commit. Quindi è possibile eseguire "git commit" per verificare quella modifica.

Oppure, se corri:

git commit -a

Prenderà automaticamente questi cambiamenti (e tutti gli altri) e li impegnerà.

Aggiornamento : se desideri solo aggiungere file eliminati, prova:

git ls-files --deleted -z | xargs -0 git rm
git commit

1
Bene, git commit -afarà quello che voglio, tranne che in alcuni casi ho file che non voglio impegnare, quindi voglio preparare il commit manualmente.
Igor Zevaka,

2
commit -a essenzialmente fa prima un "add -u"; aggiornerà l'indice con eventuali modifiche ai file noti (siano esse cancellazioni o semplici modifiche). Ovviamente puoi essere più specifico e aggiungere / rm solo i file che desideri. git.or.cz/gitwiki/… può essere utile.
Emil Sit,

2
Il set di comandi sotto l '"Aggiornamento: .." ha funzionato come un fascino. Grazie!
Jay Taylor,

10
Grazie mille per 'git ls-files --deleted | xargs git rm '!
mit

18
"git ls-files --deleted | xargs git rm" è la risposta corretta! Grazie!
reto

166

Probabilmente stai cercando -A:

git add -A

questo è simile a git add -u, ma aggiunge anche nuovi file. Questo è all'incirca l'equivalente del addremovecomando di hg (sebbene il rilevamento dello spostamento sia automatico).


8
In breve, l'uso di -u limita l'aggiunta ai file tracciati e -a includerà anche i file non tracciati. Ho solo pensato di sottolineare la differenza.
spaaarky21,

A questo punto potresti anche aggiungere tutto tramite il flag commit -a.
Zac Grierson,

94

Per mettere in scena solo i file eliminati :

for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done

Oppure (il modo xargs):

git status | awk '/deleted/ {print $2}' | xargs git rm

Puoi alias il tuo set di comandi preferito per un comodo utilizzo successivo.


2
@Saeb Comprendi la coda, ma xargsè di circa 15 minuti da padroneggiare.
Eric Wilson,

11
git status | awk '/deleted/ {print $3}' | xargs git rmsarebbe un modo più breve per farlo. grep | awk... Basta dire di no
Mark Reed,

58
git rm $(git ls-files --deleted)non è più conveniente (copiato da questo ).
Hotschke,

1
xargs o la sostituzione $ () sopra se sai che l'elenco non è enorme. Se l'elenco è enorme: git ls-files --deleted | while read f; do git rm $f; done
Andrew

2
@Andrew xargsè probabilmente più efficiente di un ciclo while per un elenco enorme, poiché passa più di un argomento ogni volta che viene eseguito git rm. Per limitare il numero di argomenti passati a git rmogni esecuzione, utilizzare l' -nopzione:git ls-files --deleted | xargs -n 15 git rm
Ajedi32

61
git rm test.txt

Prima o dopo aver eliminato il file effettivo.


7
Mentre funzionerà, spesso mi ritrovo a eliminare un sacco di file attraverso rme rimpiangerlo in seguito.
Carl

4
Perché è peggio che farlo git add -u? Sembra che sarebbe più sicuro aggiungere i file specifici che sono stati eliminati al commit, piuttosto che aggiungere TUTTE le modifiche.
Ian Dunn,

2
in realtà questa dovrebbe essere la risposta migliore in base all'ultima riga della domanda "Voglio solo un comando che cancella tutti i file da Git che vengono anche cancellati dal disco."
Ramsharan,

2
@Ramsharan no, perché non lo fa affatto. Questo elimina un singolo file; l'OP ha richiesto SPECIFICAMENTE "tutti" i file eliminati.
Adam,

1
@Ramsharan no, questo è il punto - in quasi tutti i casi NON PUOI semplicemente utilizzare un carattere jolly (non esiste un carattere jolly che corrisponda). Ecco perché c'è la risposta principale è molto più complicata.
Adam,

49

Usando git-add con le opzioni '--all' o '--update' potresti ottenere più di quanto desideri. I file nuovi e / o modificati verranno anche aggiunti all'indice. Ho una configurazione bash alias per quando voglio rimuovere i file cancellati da Git senza toccare altri file:

alias grma='git ls-files --deleted -z | xargs -0 git rm'

Tutti i file che sono stati rimossi dal file system vengono aggiunti all'indice come eliminati.


39

Non che sia davvero importante, ma non sono d'accordo con la risposta scelta:

git add -u 

... rimuoverà i file dall'indice se i file corrispondenti nella struttura di lavoro sono stati rimossi, ma metterà anche in scena i nuovi contenuti modificati dei file tracciati.

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

... d'altra parte rm solo i file eliminati che sono stati tracciati.

Quindi, secondo me, questa è l'opzione migliore.


29

Se queste sono le uniche modifiche, puoi semplicemente fare

git commit -a

per eseguire il commit di tutte le modifiche. Ciò includerà i file eliminati.


3
Non sono sicuro del motivo per cui ho votato male; git fa un buon lavoro nell'identificare i file che sono stati cancellati, anche se non te l'hai detto esplicitamente usando git rm.
SpoonMeiser,

Hai ricevuto il voto negativo perché "-a" non è un interruttore accettabile, è "-A". Modifica la tua risposta.
Sheharyar,

10
No, "-a" è un'opzione accettabile, poiché il comando è commit . "-A" è un interruttore da aggiungere ma non da impegnare . Vedo che la modifica suggerita è già stata rifiutata.
SpoonMeiser,

Nel caso in cui l'unica cosa che stai commettendo sia il file eliminato, aggiungi l'opzione --allow-empty
billrichards

err, in realtà --allow-empty è necessario solo se hai fatto git rm --cached
billrichards

20
git ls-files --deleted | xargs git rm 

è l'opzione migliore per aggiungere solo file eliminati.

Ecco alcune altre opzioni.

git add .  => Add all (tracked and modified)/new files in the working tree.

git add -u => Add all modified/removed files which are tracked.

git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.

git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.

16

git aggiungi -u

-u --update Corrisponde solo ai file già tracciati nell'indice anziché all'albero di lavoro. Ciò significa che non metterà mai in scena nuovi file, ma che metterà in scena nuovi contenuti modificati di file tracciati e che rimuoverà i file dall'indice se i file corrispondenti nella struttura di lavoro sono stati rimossi.

Se non viene fornito, il valore predefinito è "."; in altre parole, aggiorna tutti i file tracciati nella directory corrente e nelle sue sottodirectory.


La risposta più votata dice già di usare git add -u. Da dove provengono tutte le altre cose nella tua risposta, la documentazione? Dovresti collegarti alla documentazione e bloccarla se lo fa.
TheWarriorNamedFoo


11

Se vuoi aggiungerlo al tuo .gitconfigfai questo:

[alias]
  rma = !git ls-files --deleted -z | xargs -0 git rm

Quindi tutto ciò che devi fare è eseguire:

git rma

1
e da cmd linegit config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
Casey,

9
git ls-files --deleted -z | xargs -0 git rm --cached

Questo rimuoverà tutti i file cancellati precedentemente tracciati da git, oltre a gestire il caso in cui i nomi dei file hanno spazi.

A seconda della variante POSIX, potrebbe essere necessario utilizzare xargs -0 -r: questo causerà la xargschiusura graduale quando viene inviato il contenuto null.

EDIT: --cachede i --deletedflag sono usati in tandem per evitare l'eliminazione accidentale di file che non sono già stati cancellati.


7

Indica al comando di mettere in scena automaticamente i file che sono stati modificati ed eliminati, ma i nuovi file di cui non hai parlato a Git non sono interessati:

-a
--all

git add . && git commit -m -a "Your commit"

o

git add --all && git commit -m "Your commit"

1
git add --all && git commit -m "Il tuo commit" Questo ha funzionato per me in Windows 7, usando la shell dei comandi di Git bash.
kmarabet,

1
Il seguente comando ha funzionato per me in Windows-7, usando la shell dei comandi di Git bash: $ git add --all && git commit -m "rimuovi i file delle proprietà" [master 58c41ac] rimuovi i file delle proprietà 1 file modificato, 9 eliminazioni (-). .. Quindi per eseguire il push di quelle modifiche impegnate nel repository remoto sono state eseguite: $ git push origin .. Conteggio degli oggetti: 10, fatto.
kmarabet,

6

Funzionerà quanto segue, anche se hai molti file da elaborare:

git ls-files --deleted | xargs git rm

Probabilmente vorrai anche impegnarti con un commento.

Per i dettagli, consultare: Script Git utili


6

Si prega di usare -tper vedere quale comando viene effettivamente eseguito

Ho appena modificato la risposta di Virender per fare lo stesso:

git ls-files --deleted -z | xargs -t -0 git rm

5

Nessuna delle bandiere da aggiungere a Git metterà in scena solo i file rimossi; se tutto ciò che hai modificato sono file eliminati, allora stai bene, ma altrimenti, devi eseguire git-status e analizzare l'output.

Lavorando sulla risposta di Jeremy, ecco cosa ho ottenuto:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. Ottieni lo stato dei file.
  2. Per i file eliminati, isolare il nome del file.
  3. Rimuovi tutte le righe che iniziano con #s, così come una riga di stato che contiene la parola "cancellata"; Non ricordo esattamente cosa fosse, e non ci sia più, quindi potresti doverlo modificare per situazioni diverse. Penso che il raggruppamento di espressioni potrebbe essere una caratteristica specifica di GNU, quindi se non usi gnutils, potresti dover aggiungere più grep -vrighe.
  4. Passa i file a git rm.

Attaccando questo in un alias shell ora ...


5

Come accennato

git add -u

mette in scena i file rimossi per la cancellazione, MA ANCHE i file modificati per l'aggiornamento.

Per mettere in scena i file modificati che puoi fare

git reset HEAD <path>

se ti piace mantenere i tuoi impegni organizzati e puliti.
NOTA: questo potrebbe anche mettere in scena i file eliminati, quindi fai attenzione con quei caratteri jolly.


4
git commit -m 'commit msg' $(git ls-files --deleted)

Questo ha funzionato per me dopo che avevo già cancellato i file.


3

Avevo bisogno dello stesso e ho usato il pulsante "stage change" di git gui. aggiunge anche tutto.

E dopo "il palcoscenico cambiato" ho fatto "commettere" ...

quindi la mia directory di lavoro è di nuovo pulita.


Bene usare una gui è CHEATING, lol! Ma più veloce nei casi in cui il progettista della GUI ha soddisfatto le tue esigenze. È bene sapere come armeggiare con "ciò che è sotto il cofano".
Dennis,

1
FYI: questa risposta è fusa da stackoverflow.com/questions/1402776/...
Shog9

3
git rm $(git ls-files -d)

Rimuove tutti i file elencati dal git ls-filescomando (-d mostra solo i file eliminati). Non funziona per file con spazi nel nome file o nel percorso, ma semplici da ricordare


2

È possibile utilizzare git add -u <filenames>per mettere in scena solo i file eliminati.

Ad esempio, se hai eliminato i file templates/*.tpl, quindi utilizza git add -u templates/*.tpl.

Il -uè necessaria al fine di fare riferimento a file presenti nel repository, ma non sono più presenti nella directory di lavoro. Altrimenti, l'impostazione predefinita git addè cercare i file nella directory di lavoro e se si specificano i file che sono stati eliminati lì, non li troveranno.


2

Aggiunta di un alias di sistema per la gestione temporanea dei file eliminati come comando rm-all

UNIX alias rm-all='git rm $(git ls-files --deleted)'

FINESTRE doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

Nota

Windows deve essere bashinstallato.


2

(Ancora un'altra variante)

Volevo eliminare tutti i file già eliminati dai file del disco ma da una cartella specifica, lasciando intatte le altre cartelle. Per me ha funzionato:

git ls-files --deleted  | grep <folder-name> | xargs git rm

1

qualcosa di simile a

git status | sed -s "s/^.*deleted: //" | xargs git rm 

può farlo.


2019 git versione 2.13.3:git diff --diff-filter=D --name-only | xargs git rm
user151841

1

Per il progetto Visual Studio

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

che è utile quando il percorso del file eliminato ha spazio


-1

La soluzione più flessibile che ho trovato finora è quella di

git cola

E seleziona tutti i file eliminati che voglio mettere in scena.

(Nota di solito faccio tutto la riga di comando in git, ma git gestisce i file rimossi un po 'imbarazzanti).


I caratteri jolly non funzionavano con me, git add -u path/to/my/deleted-files-pattern-*.ymlquindi questa è stata la risposta migliore per me (non voler mettere in scena tutti i file eliminati, ma 50 su un paio di centinaia).
mlncn
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.