Posso restaurar arquivos excluídos (desfazer um `git clean -fdx`)?

119

Eu estava seguindo as instruções sobre como fazer páginas no github e esqueci de descer para o meu subdiretório git. Como resultado, acabei de destruir um diretório inteiro de documentos com git clean -fdx.
Existe alguma maneira de desfazer esse erro terrível?

Eric
fonte
2
Não sei ao certo, mas não acho que seja possível com o git. No entanto, um utilitário de undelete para o seu sistema de arquivos pode resolver o problema.
static_rtti
9
Curiosamente, o Git Community Book também sugere, git clean -fdxsem qualquer aviso, que a operação é muito perigosa. Eu me pergunto quantas pessoas destruíram irrevogavelmente seus arquivos com essa sugestão aparentemente inocente.
catpnose
5
Certifique-se de verificar se o seu IDE tem um "histórico local" como o Eclipse ou os IDEs do IntelliJ. Isso pode lhe poupar muita dor de cabeça devido a git cleanligações inadvertidas . Além disso, tente sair do hábito de limpar sem verificar. Crie um script Powershell ou Bash que pode ser chamado e será executado git clean -fdxncom um prompt de confirmação antes de você realmente executar a limpeza incrivelmente destrutiva.
Josh Burgess

Respostas:

129

Não. Esses arquivos sumiram.

(Apenas verificado no Linux: git clean callsunlink() , e não faz backup de nada de antemão.)

Esteira
fonte
32
Se você estiver usando um IDE avançado como RubyMine, Eclipse etc, provavelmente haverá um histórico local de arquivos excluídos e você poderá recuperá-los.
Usman
1
@Usman, no meu caso git clean, apagou acidentalmente as alterações armazenadas na .ideapasta oculta e o Histórico Local me salvou!
emkman
2
Ótima dica de @Usman. Com o Eclipse, eu poderia recuperar meu arquivo com a opção "Restaurar do histórico local ...": i.imgur.com/XWNLOk5.gifv
brandizzi
1
Na verdade, isso é POSSÍVEL, mas com um método hacky. Veja esta resposta: stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/…
Just Shadow
4
No PyCharm você também pode restaurá-los. Clique com o botão direito na pasta que os contém, clique em Histórico local, encontre a exclusão e clique em reverter.
Juanjo Conti,
48
git clean -fdxn

Fará uma simulação e mostrará quais arquivos seriam excluídos se você executasse

git clean -fdx

(claro que isso só é útil se você souber disso com antecedência, mas para a próxima vez)

Peter Ajtai
fonte
7
Para adicionar a isso, -nfunciona na maioria dos comandos git (e muitos outros comandos * nix).
Nick McCurdy
23

IntelliJ / Android Studio permite restaurar arquivos do histórico local .

Y2i
fonte
3
PyCharm também suporta isso! Obrigado por esta resposta. Estou tão feliz por ter lido o resto das respostas após as 3 primeiras serem "não, desculpe, você está sem sorte".
Bryson,
18

Não. "Git clean -fdx" irá deletar todos os arquivos e diretórios que o git não rastreia de seu diretório de trabalho. Como o Git não rastreia esses arquivos, ele não terá nenhum backup desses arquivos. Pelo menos não normalmente.

Se você fez um 'git add' em um desses arquivos relativamente recentemente (mas abortou o commit), há uma chance de encontrá-lo com 'git fsck --lost-found'. Vale a pena tentar, mas não tenha muitas esperanças.

No futuro, você deve considerar se comprometer algumas vezes com demasiada frequência do que algumas vezes raramente. Dessa forma, você terá pelo menos um backup local, mesmo se não acabar enviando esses commits para um remoto.

kusma
fonte
O verdadeiro problema era que o diretório não deveria ser um repositório também. Olhando de volta para o log, descobri que esqueci de fazer o cd para o novo diretório repo depois de mkdirexecutá-lo
Eric
1
Pouco depois de ler esta pergunta, escrevi um patch para o Git que adiciona uma variável de configuração para fazer backup de cada arquivo excluído. Talvez possa ser útil para outras pessoas? github.com/kusma/git/tree/work/clean-backup
kusma
1
Tive sorte hoje !!! Graças a "git fsck --lost-found". Usei o seguinte para obter TODAS as alterações: git fsck | awk '{print $ 3}' | xargs git show | tee searchresults.log Como eu queria todo o arquivo que adicionei e depois removi, pude obtê-lo no log. :)
Marcello de Sales
11

Como @kusma mencionou acima, se você tiver sorte (se já fez "git add"), poderá usar o seguinte para extrair o objeto inteiro:

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

Dessa forma, ele irá procurar todos os tipos de pedaços, coletar as diferenças inteiras e adicionar a um arquivo que você pode extrair o arquivo perdido. No meu caso, perdi uma aula inteira de Java.

Marcello de Sales
fonte
8

Se você estiver usando qualquer IDE Jetbrains, há uma opção para ver o histórico local de um arquivo. Caso tenha feito isso git clean, você pode recriar o arquivo e verificar o histórico local do arquivo e restaurá-lo a partir daí.

Trabalhou para mim em um único arquivo. Para um diretório completo, não tenho ideia de como fazer isso.

Rajesh Paul
fonte
Crie o arquivo no mesmo local com o mesmo nome de arquivo. No IDE, clique com o botão direito e clique em "Mostrar histórico". Copie e cole o conteúdo dele. Excelente conselho @Rajesh. Obrigado.
profundo em
1
Estou salvo. Obrigado.
Scott
Não há necessidade de copiar o conteúdo do arquivo, apenas clique com o botão direito do mouse no arquivo e clique em 'reverter' para restaurá-lo para aquela versão (mesmo que você o tenha excluído)
n00b
7

Eu tive esse problema hoje.

Como outros já disseram, o git não guarda os arquivos.

A única maneira de desfazer isso é com um utilitário de desfazer exclusão. Usei "extundelete" e recuperei tudo, mas sua milhagem / sistema de arquivos pode variar.

dougallj
fonte
7

Se você estiver trabalhando no Eclipse, uma das soluções possíveis é restaurar do histórico local do Eclipse.

Abhinav
fonte
2
estou usando o PyCharm e a história local me salvou
psychok7
1
Mesma coisa no IntelliJ IDEA!
arthurakay
RubyMine também tem história local. me salvou!
Usman
Todos os navegadores IntelliJ têm um histórico local. Agradecidamente. Eu estava usando o WebStorm e quase tive um aneurisma antes de descobrir isso. 3 dias no valor de 12 horas de trabalho dias se passaram, e eu considerei seriamente derrubar uma garrafa de bebida forte na minha mesa.
Josh Burgess
7

Na verdade, sim ! Isso é possível! Mas sem usar comandos git.
Tudo que precisamos é apenas de uma ferramenta de recuperação de arquivos como o Recuva .
Basta mencionar o caminho de onde ele foi excluído e deixá-lo recuperar os arquivos.

Também aqui estão algumas notas úteis para usar esse aplicativo:

  1. Eu recomendo fortemente que você marque esta caixa de seleção antes de restaurar os arquivos (quando os arquivos excluídos são exibidos na janela de recuperação):
    Advanced Mode-> Options-> Actions-> Restore folder structure
    Com isso todos os seus arquivos serão recuperados mantendo a estrutura de pastas, então será muito mais fácil para apenas arrastar e soltar essa pasta no caminho de onde foi excluída.
  2. Instalar a ferramenta de recuperação no dispositivo USB é muito preferível (por causa do aviso abaixo)
  3. Ao mencionar onde restaurar os arquivos, evite escolher a mesma unidade de onde os arquivos foram excluídos (novamente por causa do aviso mencionado abaixo), pois o arquivo recuperado atualmente pode substituir o outro arquivo excluído que ainda não foi recuperado. Recuperar arquivos para qualquer unidade USB é sempre uma boa solução aqui.

Aviso! Assim que você perder (excluir acidentalmente) qualquer arquivo, tente não tocar (adicionar / editar arquivos) a unidade de onde foi excluído para aumentar a possibilidade de recuperação bem-sucedida. Caso contrário, você pode perder completamente esse arquivo.

Por que funciona: quando você exclui um arquivo, na verdade ele não é excluído. Ele está apenas marcado como "excluído", então da próxima vez que você adicionar / atualizar arquivos na mesma unidade, esses arquivos antigos serão substituídos pelos novos. Mas, até que sejam sobrescritos, ainda é possível ler (e, claro, recuperar) os arquivos.

Apenas sombra
fonte
1
Obrigado, você salvou minha vida. Não sei se é a resposta correta porque não consegui recuperar tudo, mas tive sorte porque consegui os arquivos mais críticos de que precisava.
XzaR
1

Se você estiver usando git com o MSBuild, criei um destino que copia todos os arquivos e depois o faz git clean -xdf. Dessa forma, você pode restaurar facilmente o arquivo se perceber que excluiu algo que não queria excluir. Dê uma olhada aqui: http://blog.3d-logic.com/2012/11/04/safe-git-clean-with-msbuild/

Pawel
fonte
1

Fiz com um código que deveria adicionar ao meu repositório e limpei com -dfx para poder restaurar os arquivos.

Eu tentei usar debugfs, olhar e linkar de inodes, testdisk e muitas outras ferramentas que aparecem e nenhuma encontrou o diretório que este estúpido escrevendo apagou por acidente.

Baixe extundelete do sourceforge.
Você provavelmente precisará instalar o pacote e2fslibs-dev
Executar

$ ./configure 
$ make 

Ele irá gerar o binário para extundelete dentro da pasta src. No meu caso, eu apaguei erroneamente uma pasta. vamos chamá-lo de FOOBAR

Eu apenas corri:

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


e criou uma pasta chamada RESTORED_FOLDERS

motbus
fonte
1

Se você estiver usando um mac e fez backup com um Time Machine, você pode restaurar

Anulável
fonte
0

Felizmente, cometi esse erro ao usar o Windows 7. Fui para a lixeira, destaquei todos os arquivos excluídos e cliquei em "Restaurar". Feito.

Matt Cashatt
fonte
5
O que você quer dizer? git cleannão move os arquivos para a lixeira.
MEMark
0

Se você não enviou suas alterações (git push), você também pode trazer de volta as informações do seu servidor que ainda não foram atualizadas. Usei o filezilla para trazer de volta os arquivos que excluí e copiei-os em meus arquivos locais. Não é a melhor maneira de fazer isso, mas funciona e evita usar o console

Mbotet
fonte