come rimuovere i file non tracciati in Git?


110

Sto lavorando su un ramo, diciamo ramo "sperimentale", che eseguo dal mio ramo principale. Quindi, generi un modello utente in ramo sperimentale, ma non lo aggiungo ancora all'indice.

Cosa devo fare se voglio scartare tutte le modifiche dei file aggiunti di recente nel mio ramo sperimentale? I file non tracciati sono elencati come di seguito:

$ git status
 On branch new_chick
 Untracked files:
   (use "git add <file>..." to include in what will be committed)

       .project
       app/models/user.rb
       db/migrate/
       test/fixtures/users.yml
       test/unit/user_test.rb

Ho provato a eseguire "git reset --hard" nella speranza di annullare tutte queste modifiche, ma tutti i file sopra vengono ancora visualizzati.

Qualcuno, per favore, mi ha fatto luce?


Risposte:


220

Per rimuovere file / directory non tracciati:

git clean -fdx

-f - forza

-d - anche le directory

-x - rimuove anche i file ignorati (non usarlo se non vuoi rimuovere i file ignorati)


Usare con cautela!
Questi comandi possono eliminare in modo permanente file arbitrari, a cui non avevi pensato all'inizio. Per favore ricontrolla e leggi tutti i commenti sotto questa risposta e la sezione --help, ecc., In modo da conoscere tutti i dettagli per mettere a punto i tuoi comandi e ottenere sicuramente il risultato atteso.


54
Aggiungi -n prima all'anteprima in modo da non rimuovere accidentalmente elementi
Druska

8
È fantastico! Tranne che rimuoverà anche i file di configurazione che potresti aver ignorato intenzionalmente in .gitignore ma che sono ancora necessari per il tuo ambiente di sviluppo locale. Puoi usare lo stesso comando con l'extra -i per la modalità interattiva come tale: git clean -fdxi e ti chiederà quali file desideri eliminare.
moeabdol

5
Questo è ottimo, ma potresti voler aggiungere un avviso agli utenti per USARE -xCON ATTENZIONE perché eliminerà definitivamente i file. Oppure usa -ncome menzionato da @Druska
lacostenycoder

3
Non è stato -xancora utilizzato il .project e altri file di configurazione sono stati eliminati. Ho dovuto estrarre nuovamente il repository dall'ultimo commit in una nuova directory.
cronometrista

2
Penso che tu debba informare che questo comando è potenzialmente pericoloso perché può rimuovere i file desiderati !!!
Davide

20

Approccio interattivo per l'utente:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i per interattivo
-f per forzare
-d per directory
-x per file ignorati (aggiungere se richiesto)

Nota: aggiungere -n o --dry-run per controllare solo cosa farà.


17

Quelli sono file non tracciati. Ciò significa che git non li sta monitorando. Li elenca solo perché non sono nel file git ignore. Dal momento che non vengono tracciati da git, git resetnon li toccherà.

Se vuoi spazzare via tutti i file non tracciati, il modo più semplice è git clean -f(usalo git clean -ninvece se vuoi vedere cosa distruggerebbe senza effettivamente cancellare nulla). Altrimenti, puoi semplicemente eliminare i file che non desideri a mano.


5

Per eliminare file non tracciati:

git clean -f

Per eliminare anche le directory non tracciate, usa:

git clean -f -d

Per prevenire qualsiasi arresto cardiaco, utilizzare

git clean -n -f -d


Qualsiasi "arresto cardiaco" 😂😂😂
Rishi Kulshreshtha

2

Puoi anche tornare allo stato precedente del repository locale in un altro modo:

  1. Aggiungi i file non tracciati all'area di gestione temporanea con git add.
  2. tornare allo stato precedente del repository locale con git reset --hard.


0

Bene, ho avuto il problema simile. Avevo preso l'ultima ma c'erano alcune modifiche nel locale a causa delle quali l'unione non stava accadendo a un particolare file. Il file non era tracciato e non li volevo, quindi quello che ho fatto è stato:

$ git checkout filepath / filename

filepath - La posizione da cui ho eseguito il git bash. poi quando ho preso l'ultima, le modifiche erano disponibili


0

Sebbene git cleanfunzioni bene, trovo comunque utile utilizzare il mio script per pulire il repository git, ha alcuni vantaggi.

Questo mostra un elenco di file da pulire, quindi richiede interattivamente di pulire o meno. Questo è quasi sempre quello che voglio dal momento che la richiesta interattiva per file diventa noiosa.

Consente inoltre il filtraggio manuale dell'elenco che è utile quando ci sono tipi di file che non si desidera pulire (e si ha motivo di non eseguire il commit).


git_clean.sh


#!/bin/bash
readarray -t -d '' FILES < <(
    git ls-files -z --other --directory |
        grep --null-data --null -v '.bin$\|Cargo.lock$'
)
if [ "$FILES" = "" ]; then
    echo  "Nothing to clean!"
    exit 0
fi

echo "Dirty files:"
printf '  %s\n' "${FILES[@]}"

DO_REMOVE=0
while true; do
    echo ""
    read -p "Remove ${#FILES[@]} files? [y/n]: " choice
    case "$choice" in
        y|Y )
            DO_REMOVE=1
            break ;;
        n|N )
            echo "Exiting!"
            break ;;
        * ) echo "Invalid input, expected [Y/y/N/n]"
            continue ;;
    esac
done

if [ "$DO_REMOVE" -eq 1 ];then
    echo "Removing!"
    for f in "${FILES[@]}"; do
       rm -rfv "$f"
    done
fi
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.