Rimozione di più file da un repo Git che sono già stati cancellati dal disco

Ho un repository Git che ho cancellato quattro file usando rm ( non git rm ), e il mio stato Git è simile a questo:

 # 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 di git add . fa, se è ansible.

Per Git 1.x

 $ git add -u 

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

Per Git 2.0

Per mettere in scena tutto il tuo albero di lavoro:

 $ git add -u :/ 

Per mettere in scena solo il percorso corrente:

 $ git add -u . 
 git ls-files --deleted -z | xargs -0 git rm 

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

Puoi usare

 git add -u 

Per aggiungere i file eliminati all’area di gestione temporanea, quindi impegnarli

 git commit -m "Deleted files manually" 

Se esegui semplicemente:

 git add -u 

git aggiornerà il suo indice per sapere che i file che hai eliminato dovrebbero essere effettivamente parte del prossimo commit. Quindi puoi eseguire “git commit” per verificare la modifica.

Oppure, se corri:

 git commit -a 

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

Aggiornamento : se si desidera aggiungere solo file cancellati, provare:

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

Probabilmente stai cercando -A:

 git add -A 

questo è simile a git add -u, ma aggiunge anche nuovi file. Questo è all’incirca l’equivalente del comando addremove di hg (sebbene il rilevamento delle mosse sia automatico).

Per mettere in scena solo i file cancellati :

 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 

È ansible creare un alias del set di comandi preferito per un utilizzo futuro più comodo.

 git rm test.txt 

Prima o dopo aver eliminato il file attuale.

Usando git-add con le opzioni ‘–all’ o ‘–update’ puoi ottenere più di quanto volessi. Anche i file nuovi e / o modificati verranno aggiunti all’indice. Ho un setup di alias bash 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 eliminato.

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

 git add -u 

… rimuoverà i file dall’indice se sono stati rimossi i file corrispondenti nell’albero di lavoro, ma anche i nuovi contenuti modificati dei file tracciati.

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

… d’altro canto verranno solo i file cancellati che sono stati tracciati.

Quindi secondo me è l’opzione migliore.

Se quelle sono le uniche modifiche, puoi semplicemente farlo

 git commit -a 

per impegnare tutte le modifiche. Ciò includerà i file cancellati.

 git ls-files --deleted | xargs git rm 

è la migliore opzione per aggiungere solo i file cancellati.

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. 

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 i nuovi contenuti modificati dei file tracciati e che rimuoverà i file dall’indice se i file corrispondenti nell’albero di lavoro sono stati rimossi.

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

Questa semplice soluzione funziona bene per me:

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

Se vuoi aggiungerlo al tuo .gitconfig fai questo:

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

Quindi tutto ciò che devi fare è eseguire:

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

Questo rimuoverà tutti i file eliminati che sono stati tracciati in precedenza da git, oltre a gestire il caso in cui i nomi dei file contengono spazi.

A seconda della variante POSIX, potrebbe essere necessario utilizzare xargs -0 -r : questo farà sì che xargs esca con garbo quando viene eseguito il piping di contenuto nullo.

MODIFICA: i --cached e --deleted sono usati in tandem per salvaguardare la cancellazione accidentale di file che non sono già stati cancellati.

Provalo.

 -a --all Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected. git add . && git commit -m -a "Your commit" 

o

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

Si prega di usare -t per 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 

Nessuno dei flag di git-add eseguirà solo i file rimossi; se tutto quello che hai modificato sono file cancellati, allora stai bene, ma in caso contrario, devi eseguire git-status e analizzare l’output.

Lavorando sulla risposta di Jeremy, questo è quello che 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 “cancellato”; Non ricordo cosa fosse esattamente, e non c’è più, quindi potresti doverlo modificare per diverse situazioni. Penso che il raggruppamento di espressioni possa essere una caratteristica specifica per GNU, quindi se non stai usando gnutils, potresti dover aggiungere più linee grep -v .
  4. Passa i file a git rm .

Attaccando questo in un alias di shell ora …

Quanto segue funzionerà, anche se hai molti file da elaborare:

 git ls-files --deleted | xargs git rm 

Probabilmente vorrai anche impegnarti con un commento.

Per ulteriori dettagli, consultare: Utili script Git

Come accennato

 git add -u 

mette in pausa i file rimossi per la cancellazione, ma ha anche modificato i file per l’aggiornamento.

Per rimuovere i file modificati è ansible farlo

 git reset HEAD  

se ti piace mantenere i tuoi impegni organizzati e puliti.
NOTA: questo potrebbe anche rimuovere i file cancellati, quindi fai attenzione a quei caratteri jolly.

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

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

Mi serviva lo stesso pulsante git gui “stage changed”. aggiunge anche tutto.

E dopo che “stage changed” ho fatto “commit” …

quindi la mia directory di lavoro è di nuovo pulita.

Puoi usare git add -u per mettere in scena solo i file cancellati.

Ad esempio, se hai cancellato i templates/*.tpl file templates/*.tpl , usa git add -u templates/*.tpl .

L’ -u è necessaria per fare riferimento a file esistenti nel repository ma non più presenti nella directory di lavoro. Altrimenti, l’impostazione predefinita di git add consiste nel cercare i file nella directory di lavoro e, se si specificano i file che sono stati cancellati, non li troverà.

qualcosa di simile a

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

può farlo

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

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

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

Nota

Windows ha bisogno di avere bash installato.

(Ancora un’altra variazione)

Volevo eliminare tutti i file già eliminati dal disco ma da una cartella specifica, lasciando intatte le altre cartelle. Quanto segue ha funzionato per me:

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

Per il progetto di studio visivo

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

che è utile quando il percorso del file cancellato ha spazio

La soluzione più flessibile che ho trovato fino ad oggi è

 git cola 

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

(Nota: di solito faccio tutto commandline in git, ma git gestisce i file rimossi un po ‘scomodi).