Como posso recuperar um arquivo removido no Mercurial (se houver)?


100

Acidentalmente, usando uma GUI em vez de CLI, removi todos os arquivos em um projeto Mercurial.

Me recuperei com Reverter ok e perdi alguns trabalhos, que como tenho máquina do tempo poderia facilmente recuperar. Mas existe uma maneira de remover / restaurar esses arquivos? Pesquisei no manual e pesquisei, mas não consigo ver nada. Algum plug-in?

Provavelmente estou respondendo minha própria pergunta aqui, mas os arquivos foram retirados do diretório e não estavam na lixeira para serem recuperados, então presumo que Remover é irrevogável.

ps eu sei que hg forgetou hg remove -Afirei remover sem deletar do diretório, mas minha pergunta tem a ver com o erro que cometi ao invés de pensar na ação.


1
você deve ser capaz de verificar uma revisão mais antiga e ficar bem (é claro que isso só funciona no caso de você não reescrever o histórico)
volta

o problema era que eu tinha cometido, feito edições, R (emovido). Então, depois dessa sequência, sim, eu peguei o commit anterior, então voltei para ele e como eu tenho backup na forma de máquina do tempo, eu poderia pegar as últimas alterações a partir de então adicioná-las e depois fazer o commit. No entanto, se eu não tivesse um backuop, as alterações teriam sido perdidas.
PurplePilot

1
Pergunta relacionada que permite pesquisar apenas nomes de arquivos (rápido): stackoverflow.com/questions/1013550/…
Michael Pryor

Respostas:


152

Primeiro, use hg greppara localizar o arquivo excluído que deseja recuperar. A saída deste comando mostrará a última revisão para a qual o arquivo estava presente e o caminho para o arquivo excluído. Em segundo lugar, execute. hg revert -r <revision number> <path to deleted file> O arquivo excluído estará agora em sua cópia de trabalho, pronto para ser confirmado novamente.


5
funcionou bem para mim, obrigado. estava procurando a resposta para "como faço para restaurar um arquivo que excluo propositalmente?"
nc.

do eclipse, isso pode ser feito clicando com o botão direito do mouse no arquivo Selecionar equipe -> Reverter
Emil

3
Outra maneira de encontrar a revisão que contém o arquivo éhg log -I '**file.ext'
mpen de

2
Apenas para sua informação: você quer o número de revisão do commit que ainda tem o arquivo, NÃO aquele que o removeu!
Lukas Knuth

8

Citação do comentário:

Eu configurei um repositório, confirmei tudo, Removi e depois confirmei novamente

Se for esse o caso, você só precisa atualizar o diretório de trabalho para a revisão anterior:

$ hg update -C -r-2

Observe o número da revisão negativa. Se os arquivos excluídos não estiverem na revisão anterior, você pode encontrá-los usando:

$ hg log -v

5

Bem, isso funcionou para mim.

hg revert -r revision pathToTheFile

4

Para Mercurial 1.6 e superior

Se você souber o nome do arquivo de exclusão, poderá encontrar sua revisão facilmente com:

hg log -r "removes('NAME.c')"

Isso lhe dará a revisão em que um arquivo chamado NAME.c (na raiz) foi excluído.

Então você pode reverter o arquivo para a revisão anterior com (como outras respostas):

hg revert -r <revision number> <path to deleted file>

Em vez disso, você pode usar um padrão de nome de arquivo para se adaptar ao que você conhece, por exemplo, você pode usar **/NAME.cpara pesquisar em todos os diretórios. Você pode ler sobre isso em Padrões de nomes de arquivos . E use este link para saber sobre as novas especificações do revset .


1

Uma adição à resposta aceita - isso é mais rápido se você deseja desfazer todas as remoções em um commit. Excluí uma pasta grande com algumas centenas de arquivos e o fiz hg addremove, o que não era minha intenção, então tive que desfazer todas essas exclusões.

Usando Localizar arquivos excluídos no histórico do repositório do Mercurial, rapidamente? + xargs + tr, reverter todas as remoções da revisão -3 para a versão da revisão -4:

hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4 

Observe que isso falhará se algum de seus arquivos tiver espaços no nome; http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html não parece ter nenhum modelo onde {file_dels}está dividido por \nno momento.


0

Você pode desfazer o último commit em um repo com hg rollback. Há apenas um nível de reversão disponível, portanto, se você removeu com mais de um commit, isso não desfará completamente sua alteração. Isso só funciona em seu repositório local, portanto, se você tiver feito push, não será possível desfazê-lo no repositório remoto.


1
Não, isso não funciona. Estou usando um Mac com Mercurial Distributed SCM (versão 1.4.1 + 20091201). Eu configurei um repositório, confirmei tudo, Removido e depois confirmei novamente, mas isso apenas traz de volta uma lista dos arquivos marcados como R (emovido), mas não traz os arquivos de volta. Se eu marcar os arquivos como R (emovido) e Rollback antes de confirmar, nada acontecerá.
PurplePilot

Depois de fazer o rollback do hg, seu repo será revertido, mas seu diretório de trabalho atual ainda terá suas alterações. Apenas diga ao hg para fazer uma atualização limpa na revisão revertida, agora na dica: hg up -C.
ataylor

1
hg rollbacknão recuperará o arquivo removido porque a exclusão do arquivo não faz parte da transação de confirmação.
mrucci

4
Está certo. Se você deseja obter edições que não foram confirmadas antes da remoção, elas serão perdidas.
ataylor

0

Você pode remover as revisões confirmadas usando o hg stripcomando, que é fornecido pela extensão mq (Mercurial Queues). Isso deve devolver seus arquivos.

Faça um backup antes de tentar isso, porque isso irá alterar o banco de dados de changesets do Mercurial.


0

O método a seguir é direto e tão estúpido que não pode dar errado. Se você excluiu ou renomeou vários arquivos, não terá problema.

hg clone mydirectory mydirectory1

e agora você inicia o mc (ou Far Manager) e compara o que era com o que se tornou.

quando terminar, apenas delete mydirectory1.


0

O seguinte funcionou para mim.

hg revert -r <Revision Number> <File Name>

(Opcional, para reverter todos os arquivos)

hg revert -r <Revision Number> --all
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.