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.
$ git add -u
Questo dice a git di mettere automaticamente in scena i file tracciati, inclusa l’eliminazione dei file tracciati in precedenza.
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
grep -v
. 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).