2012-03-10 21 views
9

ho fatto:Come annullare git rm -rf dirname senza un primo commit?

git init 
git add . 
git rm -rf dirname 

cercando in altri answsers, git reset --hard HEAD, git checkout -f e git reflog non ha funzionato, a quanto pare, perché non c'è nessun capo di tornare a, nè un commit per ottenere i file di ritorno da.

C'è un modo per recuperare i file?

risposta

8

Non c'è modo.

In genere, git rm controlla che i file siano già stati salvati prima di eliminarli, in modo da non perdere il lavoro. Tuttavia, l'utilizzo di -f sostituisce questo controllo.

In breve:

  • Non usare -f.
  • Non toccare nulla che non è stato eseguito.
+2

Proprio come unix - '-f' significa che è meglio essere sicuri di ciò che si sta facendo. –

1

No, per quanto ne so. Credo che git scolleghi i file, proprio come fa rm -rf. Non importa se conosce i file o no, sarà lieto di nuke la directory. In realtà, la tua unica risorsa è provare a utilizzare uno strumento di recupero file come se tu avesse fatto rm -rf

0

Se git non sta monitorando la directory dirname, non consente di eliminare la directory con git rm -rf in quanto non è al corrente. Si (avrebbe) ottiene un errore come

fatal: pathspec 'dirname' did not match any files 

unico modo per avere eliminato è che se si fosse realizzato un git add . o git add dirname dopo il git init. Se questo è il caso, i tuoi file sono spariti e non puoi recuperarli perché non è mai stato eseguito e Git non li rintraccia. E 'buono come facendo un rm -rf su una cartella normale (e non può recuperare se non si dispone di backup)

+0

Lo fa, però? Non l'ho provato, ma ho pensato che il flag -f sopprimerebbe quell'errore. – Matt

+0

A meno che non si usi '-f'? Ciò "sostituirà il controllo aggiornato", qualunque cosa significhi. –

+0

@Matt - No, non lo sopprime. '-f' in' git rm' è solo per annullare il controllo aggiornato. – manojlds

0

git reset --hard aiutato mentre delezione non era ancora commesso e, in generale, la cancellazione è stata interrotta da Ctrl+Z

1

Avviso: l'esecuzione di git prune senza l'opzione -n (1) cancella i dati non raggiungibili.

Potrebbe esserci un modo, utilizzando git prune e git cat-file.

Esecuzione git prune -n lista volontà quali oggetti sarebbe stato rimosso per la potatura:

$ git prune -n 
9cc84ea9b4d95453215d0c26489d6a78694e0bc6 blob 
c315143703752ef4d11ca7d93f2c324872b2ebff blob 

Ogni riga corrisponde ad un file eliminato.

Ora, usando git cat-file, siamo in grado di ripristinare il contenuto del file rimosso in un nuovo file:

git cat-file -p 9cc84ea9b4d95453215d0c26489d6a78694e0bc6 > restored-filename.whatever 

(1) Dalle git prune documentazione:

NOME
git-prune - Elimina tutti gli oggetti non raggiungibili dal database degli oggetti

OPZIONI
-n
--dry-run
Non rimuovere nulla; basta segnalare cosa rimuoverà.