Domanda

Ho un repository Git da cui ho eliminato quattro file 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 posso rimuovere questi file da Git senza dover passare manualmente e aggiungere ciascun file in questo modo:

git rm file1 file2 file3 file4

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

È stato utile?

Soluzione

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 .

Altri suggerimenti

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 nell'area di gestione temporanea, quindi eseguirne il commit

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 effettivamente far parte del prossimo commit. Quindi puoi eseguire & Quot; git commit & Quot; per verificare tale modifica.

Oppure, se corri:

git commit -a

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

Aggiorna : se desideri solo aggiungere file eliminati, prova:

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

Probabilmente stai cercando -A:

git add -A

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

Per mettere in scena solo i file eliminati:

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

O (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 .

git rm test.txt

Prima o dopo aver eliminato il file effettivo.

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.

Non è 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.

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.

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.

git add -u

-u --aggiornare 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 alcun valore, per impostazione predefinita ". " ;; 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 cancellati precedentemente tracciati 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 causerà xargs la chiusura graduale quando viene eseguito il piping del contenuto null.

EDIT: --cached e --deleted i flag sono usati in tandem per salvaguardarsi dall'eliminazione 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"

Utilizzare -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 da git-add metterà in scena solo i file rimossi; se tutto ciò 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, 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, nonché una riga di stato con la parola " cancellata " dentro; 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 stai usando gnutils, potresti dover aggiungere più grep -v righe.
  4. Passa i file a git rm.

Inserendo questo in un alias shell ora ...

Come menzionato

git add -u

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

Per annullare la messa in scena dei file modificati, è possibile eseguire

git reset HEAD <path>

se ti piace mantenere i tuoi commit organizzati e puliti.
NOTAE< Questo potrebbe anche mettere in scena i file eliminati, quindi fai attenzione con quei caratteri jolly.

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

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

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

Avevo bisogno dello stesso e usato git gui " stage modificato " pulsante. aggiunge anche tutto.

E dopo " la fase è cambiata " Ho fatto & Quot; commit & Quot; ...

quindi la mia directory di lavoro è di nuovo pulita.

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

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

-u è necessario per fare riferimento ai file esistenti nel repository ma che non esistono più nella directory di lavoro. Altrimenti, il valore predefinito di git add è cercare i file nella directory di lavoro e se si specificano i file che sono stati eliminati lì, non li troveranno.

qualcosa come

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

potrebbe farlo.

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

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

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

Nota

Windows deve avere bash installato.

(Ennesima 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
git rm $(git ls-files -d)

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

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

La soluzione più flessibile che ho trovato finora è

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top