Posso ripristinare i file cancellati (annullare un `git clean -fdx`)?


119

Stavo seguendo le istruzioni su come creare pagine GitHub e ho dimenticato di spostarmi nella mia sottodirectory git. Di conseguenza, ho appena bombardato un'intera directory di documenti con git clean -fdx.
C'è un modo per rimediare a questo terribile errore?


2
Non lo so per certo, ma non credo sia possibile con git. Tuttavia, un'utilità di ripristino per il tuo filesystem potrebbe fare il trucco.
static_rtti

9
È interessante notare che Git Community Book suggerisce anche git clean -fdxsenza alcun preavviso che l'operazione è così pericolosa. Mi chiedo quante persone abbiano distrutto irrevocabilmente i propri file con questo suggerimento apparentemente innocente.
catpnosi

5
Assicurati di controllare se il tuo IDE ha una "Cronologia locale" come fanno gli IDE Eclipse o IntelliJ. Ciò può farti risparmiare un sacco di angoscia per git cleanchiamate involontarie . Inoltre, cerca di liberarti dall'abitudine di pulire senza controllare. Crea uno script Powershell o Bash che può essere chiamato che verrà eseguito git clean -fdxncon una richiesta di conferma prima di eseguire effettivamente la pulizia incredibilmente distruttiva.
Josh Burgess

Risposte:


129

No. Quei file sono spariti.

(Appena controllato su Linux: git clean callsunlink() e non esegue il backup di nulla in anticipo.)


32
Se stai utilizzando un IDE avanzato come RubyMine, Eclipse ecc., È probabile che abbia una cronologia locale dei file eliminati e potresti essere in grado di recuperarli.
Usman

1
@Usman nel mio caso git cleanaveva cancellato accidentalmente le modifiche accantonate all'interno della .ideacartella nascosta e la cronologia locale mi ha salvato!
emkman

2
Ottimo consiglio di @Usman. Con Eclipse, potrei recuperare il mio file con l'opzione "Ripristina dalla cronologia locale ...": i.imgur.com/XWNLOk5.gifv
brandizzi

1
In realtà questo è POSSIBILE ma con metodo hacky. Vedi questa risposta: stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/…
Just Shadow

4
In PyCharm puoi anche ripristinarli. Fare clic con il tasto destro nella cartella che li aveva, fare clic su Cronologia locale, trovare l'eliminazione e fare clic su Ripristina.
Juanjo Conti

48
git clean -fdxn

Eseguirà un funzionamento a secco e ti mostrerà quali file verrebbero eliminati se eseguissi

git clean -fdx

(ovviamente questo è utile solo se lo sai in anticipo, ma per la prossima volta)


7
Per aggiungere a questo, -nfunziona sulla maggior parte dei comandi git (e molti altri comandi * nix).
Nick McCurdy


18

No. "git clean -fdx" cancellerà tutti i file e le directory che git non tiene traccia dalla tua directory di lavoro. Poiché Git non tiene traccia di questi file, non avrà alcun backup di questi file. Almeno non di solito.

Se hai eseguito un 'git add' su uno di questi file relativamente di recente (ma hai interrotto il commit), c'è la possibilità che tu possa trovarlo con 'git fsck --lost-found'. Vale la pena provare, ma non sperare troppo.

In futuro dovresti considerare piuttosto di impegnarti un paio di volte troppo spesso che poche volte troppo raramente. In questo modo avrai almeno un backup locale, anche se non finisci per spingere questi commit su un remoto.


Il vero problema era che la directory non doveva essere anche un repository. Guardando indietro al registro, si scopre che ho dimenticato di eseguire il cd nella nuova directory dei repository dopo mkdiraverlo eseguito
Eric

1
Poco dopo aver letto questa domanda, ho scritto una patch a Git che aggiunge una variabile di configurazione per eseguire il backup di ogni file eliminato. Forse potrebbe essere utile per altri? github.com/kusma/git/tree/work/clean-backup
kusma

1
Oggi sono stato fortunato !!! Grazie a "git fsck --lost-found". Ho usato quanto segue per ottenere TUTTE le modifiche: git fsck | awk '{print $ 3}' | xargs git show | tee searchresults.log Poiché volevo l'intero file che avevo aggiunto e poi rimosso, potevo recuperarlo dal log. :)
Marcello de Sales

11

Come menzionato sopra @kusma, se sei fortunato (se hai mai fatto "git add"), puoi usare quanto segue per estrarre l'intero oggetto:

git fsck | awk '{print $3}' | xargs git show | tee searchresults.log

In questo modo, cercherà tutti i tipi di blocchi, raccoglierà le intere differenze e aggiungerà a un file che potrai estrarre il file perso. Nel mio caso, avevo perso un'intera classe Java.


8

Se stai usando un IDE Jetbrains, c'è un'opzione per vedere la cronologia locale di un file. In caso git cleancontrario, è possibile ricreare il file e controllare la cronologia locale del file e ripristinarlo da lì.

Ha funzionato per me per un singolo file. Per una directory completa non ho idea di come farlo.


Crea il file nella stessa posizione con lo stesso nome file. In IDE fare clic con il tasto destro e fare clic su "Mostra cronologia". Copia incolla il contenuto da esso. Ottimo consiglio @Rajesh. Grazie.
profondo

1
Sono salvo. Grazie.
Scott

Non è necessario copiare il contenuto del file, basta fare clic con il pulsante destro del mouse sul file e fare clic su "ripristina" per ripristinarlo a quella versione (anche se è stato eliminato)
n00b

7

Oggi ho avuto questo problema.

Come altri hanno già detto, git non conserva i file.

L'unico modo per annullare questa operazione è con un'utilità di ripristino. Ho usato "extundelete" e ho recuperato tutto, ma il tuo chilometraggio / filesystem può variare.


7

Se stai lavorando su Eclipse, una delle possibili soluzioni è ripristinare dalla cronologia locale di Eclipse.


2
Sto usando PyCharm e la storia locale mi ha salvato
psychok7

1
Stessa cosa in IntelliJ IDEA!
arthurakay

RubyMine ha anche una storia locale. mi ha salvato!
Usman

Tutti i browser IntelliJ hanno una cronologia locale. Per fortuna. Stavo usando WebStorm e quasi ho avuto un aneurisma prima di scoprirlo. Sono passati 3 giorni di lavoro di 12 ore e ho preso seriamente in considerazione l'idea di buttare giù una bottiglia di superalcolico alla mia scrivania.
Josh Burgess

7

In realtà ! Questo è possibile! Ma senza usare i comandi git.
Tutto ciò di cui abbiamo bisogno è solo uno strumento di recupero file come Recuva .
Basta menzionare il percorso da cui è stato eliminato e lasciare che recuperi i file.

Inoltre, ecco alcune note utili per l'utilizzo di quell'app:

  1. Ti consiglio vivamente di selezionare questa casella di controllo prima di ripristinare i file (quando i file eliminati vengono visualizzati nella finestra di ripristino):
    Advanced Mode-> Options-> Actions-> Restore folder structure
    Con questo tutti i tuoi file verranno ripristinati mantenendo la struttura delle cartelle, quindi sarà molto più semplice per trascinare e rilasciare quella cartella nel percorso da cui è stata eliminata.
  2. Installare lo strumento di ripristino sul dispositivo USB è molto preferibile (a causa dell'avviso di seguito)
  3. Pur menzionando dove ripristinare i file, evitare di scegliere la stessa unità da cui sono stati eliminati i file (di nuovo a causa dell'avviso di seguito indicato), poiché il file attualmente ripristinato potrebbe sovrascrivere l'altro file eliminato che non è ancora stato ripristinato. Il ripristino dei file su qualsiasi unità USB è sempre una buona soluzione.

Avvertimento! Non appena perdi (elimini accidentalmente) un file, cerca di non toccare (aggiungi / modifica file) l'unità da cui è stato eliminato per aumentare le possibilità di recupero riuscito. Altrimenti potresti perdere completamente quel file.

Perché funziona: quando elimini un file, in realtà non viene eliminato. È solo contrassegnato come "cancellato", quindi la prossima volta che aggiungi / aggiorni i file sulla stessa unità, quei vecchi file vengono sovrascritti con quelli nuovi. Ma fino a quando non vengono sovrascritti è ancora possibile leggere (e ovviamente recuperare) i file.


1
Grazie mi hai salvato la vita. Non so se sia la risposta corretta perché non sono riuscito a recuperare tutto ma sono stato fortunato perché ho ottenuto i file più critici di cui avevo bisogno.
XzaR

2

Ho fatto con un codice che avrei dovuto aggiungere al mio repository e ho pulito con -dfx ho potuto ripristinare i file.

Ho provato a usare debugfs, look e link da inode, testdisk e molti altri strumenti che appaiono e nessuno ha trovato la directory che questa stupida scrittura ha cancellato per sbaglio.

Scarica extundelete da sourceforge.
Probabilmente dovrai installare il pacchetto e2fslibs-dev
Run

$ ./configure 
$ make 

Genererà il binario per extundelete all'interno della cartella src Nel mio caso, ho cancellato erroneamente una cartella. chiamiamolo FOOBAR

Ho appena corso:

$  sudo ./extundelete --restore-directory <full path to FOOBAR > <the partition> 


e ha creato una cartella denominata RESTORED_FOLDERS


Wow! anche se questo non ha recuperato il file che volevo, è qualcosa di cui prenderò nota - tornerà sicuramente utile!
venerdì


1

Se stai usando un Mac e hai eseguito il backup con un Time Machine, puoi ripristinare


0

Fortunatamente, ho commesso questo errore durante l'utilizzo di Windows 7. Sono andato nel cestino, ho evidenziato tutti i file eliminati e ho fatto clic su "Ripristina". Fatto.


6
Cosa intendi? git cleannon sposta i file nel cestino.
MEMark

0

Se non hai eseguito il push delle modifiche (git push) puoi anche riportare le informazioni dal tuo server che non sono ancora aggiornate. Ho usato filezilla per riportare i file che ho cancellato e copiati nei miei file locali. Non è il modo migliore per farlo, ma funziona ed evita di usare la console

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.