Puis-je restaurer des fichiers supprimés (annuler un `git clean -fdx`)?

119

Je suivais les instructions pour créer des pages github et j'ai oublié de descendre dans mon sous-répertoire git. En conséquence, je viens de détruire un répertoire entier de documents avec git clean -fdx.
Est-il possible de réparer cette terrible erreur?

Eric
la source
2
Je ne sais pas avec certitude, mais je ne pense pas que ce soit possible avec git. Cependant, un utilitaire de restauration de votre système de fichiers peut faire l'affaire.
static_rtti
9
Fait intéressant, Git Community Book suggère également git clean -fdxsans aucun avertissement que l'opération est si dangereuse. Je me demande combien de personnes ont irrévocablement détruit leurs fichiers avec cette suggestion apparemment innocente.
catpnosis
5
Assurez-vous de vérifier si votre IDE a une "histoire locale" comme le font les IDE Eclipse ou IntelliJ. Cela peut vous épargner beaucoup de chagrin en raison d' git cleanappels par inadvertance . Aussi, essayez de sortir de l'habitude de nettoyer sans vérifier. Créez un script Powershell ou Bash qui peut être appelé qui s'exécutera git clean -fdxnavec une invite de confirmation avant d'exécuter réellement le nettoyage incroyablement destructeur.
Josh Burgess

Réponses:

129

Non. Ces fichiers ont disparu.

(Juste vérifié sur Linux: git clean callsunlink() , et ne sauvegarde rien au préalable.)

Tapis
la source
32
Si vous utilisez un IDE avancé tel que RubyMine, Eclipse, etc., il y a de fortes chances qu'il ait un historique local des fichiers supprimés et que vous puissiez les récupérer.
Usman
1
@Usman dans mon cas git cleanavait accidentellement supprimé les modifications mises en attente dans le .ideadossier caché et l'histoire locale m'a sauvé!
emkman
2
Bon conseil de @Usman. Avec Eclipse, je pourrais récupérer mon fichier avec l'option "Restaurer à partir de l'historique local ...": i.imgur.com/XWNLOk5.gifv
brandizzi
1
En fait, c'est POSSIBLE mais avec une méthode hacky. Voir cette réponse: stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/…
Just Shadow
4
Dans PyCharm, vous pouvez également les restaurer. Faites un clic droit dans le dossier qui les contenait, cliquez sur dans Historique local, recherchez la suppression et cliquez sur revenir.
Juanjo Conti
48
git clean -fdxn

Fera un essai à sec et vous montrera quels fichiers seraient supprimés si vous exécutiez

git clean -fdx

(bien sûr, cela n'est utile que si vous le savez à l'avance, mais pour la prochaine fois)

Peter Ajtai
la source
7
Pour ajouter à cela, -nfonctionne sur la plupart des commandes git (et de nombreuses autres commandes * nix).
Nick McCurdy
23

IntelliJ / Android Studio permet de restaurer des fichiers à partir de l'historique local .

Y2i
la source
3
PyCharm prend également en charge cela! Merci pour cette réponse. Je suis tellement content d'avoir lu le reste des réponses après que le top 3 était "non désolé vous n'avez pas de chance".
Bryson
18

Non. "Git clean -fdx" supprimera tous les fichiers et répertoires que git ne suit pas de votre répertoire de travail. Étant donné que Git ne suit pas ces fichiers, il n'aura aucune sauvegarde de ces fichiers. Du moins pas d'habitude.

Si vous avez fait un 'git add' sur l'un de ces fichiers relativement récemment (mais que vous avez abandonné le commit), il y a une chance que vous puissiez le trouver avec 'git fsck --lost-found'. Cela vaut la peine d'essayer, mais n'espérez pas trop.

À l'avenir, vous devriez envisager de vous engager plusieurs fois trop souvent plutôt que quelques fois trop rarement. De cette façon, vous aurez au moins une sauvegarde locale, même si vous ne finissez pas par pousser ces commits vers une télécommande.

kusma
la source
Le vrai problème était que le répertoire n'était pas censé être un référentiel également. En regardant le journal, il s'avère que j'ai oublié de cd dans le nouveau répertoire de mkdirdépôt après l'avoir utilisé
Eric
1
Peu de temps après avoir lu cette question, j'ai écrit un patch sur Git qui ajoute une variable de configuration pour sauvegarder chaque fichier supprimé. Peut-être que cela pourrait être utile pour d'autres? github.com/kusma/git/tree/work/clean-backup
kusma
1
J'ai eu de la chance aujourd'hui !!! Merci à "git fsck --lost-found". J'ai utilisé ce qui suit pour obtenir TOUS les changements: git fsck | awk '{imprimer $ 3}' | xargs git show | tee searchresults.log Comme je voulais le fichier entier que j'avais ajouté puis supprimé, je pouvais l'obtenir à partir du journal. :)
Marcello de Sales
11

Comme @kusma mentionné ci-dessus, si vous avez de la chance (si vous avez déjà fait "git add"), vous pouvez utiliser ce qui suit pour extraire l'objet entier:

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

De cette façon, il recherchera tous les types de morceaux, collectera les différences entières et ajoutera à un fichier que vous pourrez extraire du fichier perdu. Dans mon cas, j'avais perdu une classe Java entière.

Marcello de Sales
la source
8

Si vous utilisez un IDE Jetbrains, il existe une option pour voir l'historique local d'un fichier. Dans le cas où vous avez fait git clean, vous pouvez recréer le fichier et vérifier l'historique local du fichier et le restaurer à partir de là.

A travaillé pour moi pour un seul fichier. Pour un répertoire complet, je ne sais pas comment faire cela.

Rajesh Paul
la source
Créez le fichier au même emplacement avec le même nom de fichier. Dans l'IDE, faites un clic droit et cliquez sur "Afficher l'historique". Copiez-collez le contenu de celui-ci. Excellent conseil @Rajesh. Merci.
profond
1
Je suis sauvé. Je vous remercie.
Scott
Pas besoin de copier le contenu du fichier, il suffit de cliquer avec le bouton droit sur le fichier et de cliquer sur `` revenir '' pour le restaurer à cette version (même si vous l'avez supprimé)
n00b
7

J'ai eu ce problème aujourd'hui.

Comme d'autres l'ont dit, git ne conserve pas les fichiers.

La seule façon d'annuler cela est d'utiliser un utilitaire de restauration. J'ai utilisé "extundelete" et j'ai tout récupéré, mais votre kilométrage / système de fichiers peut varier.

dougallj
la source
7

Si vous travaillez sur Eclipse, l'une des solutions possibles est de restaurer à partir de l'historique local d'Eclipse.

Abhinav
la source
2
J'utilise PyCharm et l'histoire locale m'a sauvé
psychok7
1
Même chose dans IntelliJ IDEA!
arthurakay
RubyMine a également une histoire locale. m'a sauvé!
Usman
Tous les navigateurs IntelliJ ont une histoire locale. Heureusement. J'utilisais WebStorm et j'avais à peu près un anévrisme avant de le découvrir. 3 jours valant 12 heures de travail, et j'ai sérieusement envisagé de boire une bouteille d'alcool fort à mon bureau.
Josh Burgess
7

En fait oui ! C'est possible! Mais sans utiliser les commandes git.
Tout ce dont nous avons besoin est juste un outil de récupération de fichiers comme Recuva .
Mentionnez simplement le chemin d'où il a été supprimé et laissez-le récupérer les fichiers.

Voici également quelques notes utiles pour utiliser cette application:

  1. Je vous recommande vivement de cocher cette case avant de restaurer des fichiers (lorsque des fichiers supprimés apparaissent dans la fenêtre de récupération):
    Advanced Mode-> Options-> Actions->Restore folder structure
    Avec cela, tous vos fichiers seront récupérés en conservant la structure des dossiers, ce sera donc beaucoup plus facile pour simplement faire glisser et déposer ce dossier vers le chemin d'où il a été supprimé.
  2. Il est préférable d'installer l'outil de récupération sur un périphérique USB (en raison de l'avertissement ci-dessous)
  3. Tout en mentionnant où restaurer les fichiers, évitez de choisir le même lecteur à partir duquel les fichiers ont été supprimés (encore une fois à cause de l'avertissement mentionné ci-dessous), car le fichier actuellement récupéré pourrait écraser l'autre fichier supprimé qui n'est pas encore récupéré. La récupération de fichiers sur n'importe quelle clé USB est toujours une bonne solution.

Avertissement!Dès que vous perdez (supprimez accidentellement) un fichier, essayez de ne pas toucher (ajouter / modifier des fichiers) le lecteur d'où il a été supprimé pour augmenter les possibilités de récupération réussie. Sinon, vous risquez de perdre complètement ce fichier.

Pourquoi cela fonctionne: lorsque vous supprimez un fichier, il n'est en fait pas supprimé. Il est simplement marqué comme «supprimé», donc la prochaine fois que vous ajoutez / mettez à jour des fichiers sur le même lecteur, ces anciens fichiers sont remplacés par les nouveaux. Mais jusqu'à ce qu'ils soient écrasés, il est toujours possible de lire (et bien sûr de récupérer) les fichiers.

Juste l'ombre
la source
1
Merci, tu m'as sauvé la vie. Je ne sais pas si c'était la bonne réponse car je ne pouvais pas tout récupérer mais j'ai eu de la chance car j'ai eu les fichiers les plus critiques dont j'avais besoin.
XzaR
2

Je l'ai fait avec un code que je devais ajouter à mon référentiel et j'ai nettoyé avec -dfx je pourrais restaurer les fichiers.

J'ai essayé d'utiliser debugfs, look and link from inodes, testdisk et de nombreux autres outils qui apparaissent et aucun n'a trouvé le répertoire que cette écriture stupide a effacé par accident.

Téléchargez extundelete depuis sourceforge.
Vous devrez probablement installer le package e2fslibs-dev
Run

$ ./configure 
$ make 

Il générera le binaire pour extundelete dans le dossier src Dans mon cas, j'ai mal effacé un dossier. appelons ça FOOBAR

Je viens de courir:

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


et il a créé un dossier nommé RESTORED_FOLDERS

motbus
la source
Hou la la! bien que cela n'ait pas permis de récupérer le fichier que je voulais, c'est quelque chose dont je vais prendre note - cela me sera certainement utile!
vyom
1

Si vous utilisez git avec MSBuild, j'ai créé une cible qui copie tous les fichiers puis le fait git clean -xdf. De cette façon, vous pouvez facilement restaurer le fichier si vous réalisez que vous avez supprimé quelque chose que vous ne vouliez pas supprimer. Jetez un œil ici: http://blog.3d-logic.com/2012/11/04/safe-git-clean-with-msbuild/

Pawel
la source
1

Si vous utilisez un mac et sauvegardé avec un Time Machine, vous pouvez restaurer

Nullable
la source
0

Heureusement, j'ai fait cette erreur en utilisant Windows 7. Je suis allé dans la corbeille, j'ai mis en évidence tous les fichiers supprimés et j'ai cliqué sur "Restaurer". Terminé.

Matt Cashatt
la source
6
Que voulez-vous dire? git cleanne déplace pas les fichiers vers la corbeille.
MEMark
0

Si vous n'avez pas poussé vos modifications (git push), vous pouvez également ramener les informations de votre serveur qui ne sont pas encore mises à jour. J'ai utilisé filezilla pour ramener les fichiers que j'ai supprimés et les ai copiés dans mes fichiers locaux. Ce n'est pas la meilleure façon de le faire, mais cela fonctionne et évite d'utiliser la console

Mbotet
la source