web-dev-qa-db-fra.com

Puis-je annuler un `git clean -fdx`?

Je suivais les instructions sur faire des pages github , et j'ai oublié de descendre dans mon sous-répertoire git. En conséquence, je viens de balayer tout un répertoire de documents avec git clean -fdx. Y a-t-il un moyen de réparer cette terrible erreur?

96
Eric

Non, ces fichiers sont partis.

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

103
Mat
git clean -fdxn

Fera un dry run , et vous montrera quels fichiers seront supprimés si vous couriez

git clean -fdx

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

40
Peter Ajtai

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

Si vous avez effectué un ajout récent à l'un de ces fichiers (mais que le commit a été annulé), vous pouvez le trouver avec "git fsck --lost-found". Cela vaut la peine d'essayer, mais n'ayez pas trop d'espoir.

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

16
kusma
11
Y2i

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

7
Abhinav

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

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

La seule façon de l'annuler consiste à utiliser un utilitaire de suppression. J'ai utilisé "extundelete" et tout récupéré, mais votre système de fichiers/kilométrage peut varier.

6
dougallj

Comme @kusma mentionné ci-dessus, si vous êtes chanceux (si vous avez déjà "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 diffs complets et ajoutera à un fichier que vous pouvez extraire le fichier perdu. Dans mon cas, j'avais perdu toute une classe Java.

6

En fait Oui! C'est possible! Mais sans utiliser les commandes git.
Tout ce dont nous avons besoin n’est qu’un outil de récupération de fichier comme Recuva .
Il suffit de mentionner le chemin d’où il a été supprimé et de le laisser récupérer les fichiers. 

Voici également quelques notes utiles pour utiliser cette application: 

  1. Je vous recommande fortement de cocher cette case avant de restaurer les 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 du dossier Il sera alors beaucoup plus facile de glisser-déposer ce dossier Dans le chemin où il a été supprimé. 
  2. L'installation de l'outil de récupération sur un périphérique USB est de loin préférable (en raison de l'avertissement ci-dessous). 
  3. Tout en indiquant où restaurer les fichiers, évitez que ne choisisse le même lecteur que celui où les fichiers ont été supprimés (encore une fois en raison de l'avertissement mentionné ci-dessous), car le fichier actuellement récupéré pourrait écraser l'autre fichier supprimé qui n'a pas encore été récupéré. Récupérer des fichiers sur n’importe quel lecteur USB est toujours une bonne solution.

Attention! Dès que vous perdez (supprimez accidentellement) un fichier, essayez de ne pas toucher (ajouter/éditer des fichiers) le lecteur à partir duquel il a été supprimé pour augmenter les chances de récupération. Sinon, vous risquez de perdre complètement ce fichier.

Pourquoi cela fonctionne: Lorsque vous supprimez un fichier, en réalité, il n'est 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 écrasé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.

4
Just Shadow

Si vous utilisez un Jetbrains IDE, une option vous permet de voir l'historique local d'un fichier. Si vous avez déjà exécuté git clean, vous pouvez recréer le fichier, vérifier l'historique local du fichier et le restaurer à partir de là.

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

1
Rajesh Paul

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

1
Matt Cashatt

Si vous utilisez git avec MSBuild, j'ai créé une cible qui copie tous les fichiers, puis 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 oeil ici: http://blog.3d-logic.com/2012/11/04/safe-git-clean-with-msbuild/

1
Pawel

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

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

Téléchargez extundelete de sourceforge. 
Vous devrez probablement installer le paquet e2fslibs-dev
Courir 

$ ./configure 
$ make 

Il va générer le binaire pour extundelete dans le dossier srcDans mon cas, j'ai effacé un dossier par erreur. appelons-le FOOBAR

Je viens de courir: 

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


et il a créé un dossier nommé RESTORED_FOLDERS

0
motbus