Descartar tudo e obter cópia limpa da última revisão?

159

Estou movendo um processo de construção para usar o mercurial e quero recuperar o diretório de trabalho para o estado da revisão da dica. As execuções anteriores do processo de construção modificaram alguns arquivos e adicionaram alguns que eu não quero confirmar, por isso tenho alterações locais e arquivos que não foram adicionados ao repositório.

Qual é a maneira mais fácil de descartar tudo isso e obter um diretório de trabalho limpo com a revisão mais recente?

Atualmente estou fazendo isso:

hg revert --all
<build command here to delete the contents of the working directory, except the .hg folder.>
hg pull
hg update -r MY_BRANCH

mas parece que deveria haver uma maneira mais simples.

Quero fazer o equivalente a excluir o repositório, fazer um novo clone e uma atualização. Mas o repo é grande demais para que seja rápido o suficiente.

Rory
fonte
1
"(Exclua o conteúdo ...)" é um comentário ao comando "revert --all" ou uma etapa que você executa? Eu pergunto porque "hg update" atualizará apenas os arquivos que foram alterados. Se você remover outros arquivos antes da atualização, não os recuperará, a menos que você atualize novamente para a revisão nula ( hg update 00) e faça o backup até a dica. Por que não hg revert --allbasta voltar a um estado consistente de pasta de trabalho antes de puxar e atualizar?
Lasse V. Karlsen
é uma etapa separada feita com o meu software de compilação. (Eu poderia ter usado apenas uma linha de comando excluir, mas não o fez.)
Rory
1
Você pode achar que o archivecomando é útil no futuro. Por exemplo, você poderia hg archive ../newbuild, e um instantâneo do seu repositório hg updateserá finalmente colocado lá. Normalmente, faço isso para compilações noturnas, apenas para não arriscar sobrecarregar meu repositório. Apenas exclua o diretório de compilação quando não precisar mais dele.
Tim Post

Respostas:

212

Essas etapas devem poder ser reduzidas para:

hg pull
hg update -r MY_BRANCH -C

O -Csinalizador informa ao comando update para descartar todas as alterações locais antes da atualização.

No entanto, isso ainda pode deixar arquivos não rastreados em seu repositório. Parece que você quer se livrar deles também, então eu usaria a purgeextensão para isso:

hg pull
hg update -r MY_BRANCH -C
hg purge

De qualquer forma, não existe um único comando que você possa solicitar ao Mercurial para executar tudo o que deseja aqui, exceto se você alterar o processo para o método de "clone completo" que você diz que não pode executar.

Lasse V. Karlsen
fonte
6
Obrigado, foi o 'expurgo' que eu precisava. A atualização -C não se livra de arquivos não rastreados, que é a principal coisa com a qual eu estava lutando.
Rory
4
Você pode usar o TortoiseHg para limpar também. Você só precisa ativar a extensão nas configurações do ambiente de trabalho (ou editar mercurial.ini).
Dave
18
Se a extensão de limpeza não estiver ativada, você também poderá usar o comando da seguinte maneira: hg --config "extensions.purge=" purge --all
Samuel Delisle
5
@ csharptest.net hg purge --allsó me deu uma boa dor de cabeça, uma vez que também apagado minhas configurações locais, ou seja: banco de dados de usuário / senha etc. :)
VMC
@SamuelDelisle obrigado senhor, eu não queria fazer nenhuma alteração na configuração apenas por este comando único no meu script!
joonas.fi
113
hg up -C

Isso removerá todas as alterações e atualizará para o cabeçalho mais recente na ramificação atual.

E você pode ativar a extensão de limpeza para poder remover todos os arquivos não versionados também.

zerkms
fonte
Isso inclui arquivos não rastreados? Eu tive alguns problemas com aqueles em outros comandos que estava tentando. Vou tentar agora ...
Rory
7
@Rory: não, hg purgeé para arquivos não versionados.
Zerkms
10

Para excluir não rastreados no * nix sem a extensão de eliminação, você pode usar

hg pull
hg update -r MY_BRANCH -C
hg status -un|xargs rm

Qual está usando

update -r --rev revisão REV

update -C --clean descarta alterações não confirmadas (sem backup)

status -u --unknown mostra apenas arquivos desconhecidos (não rastreados)

status -n --no-status ocultar prefixo de status

KCD
fonte
4

Se você está procurando um método fácil , tente isso.

Por mim, mal consigo lembrar as linhas de comando de todas as minhas ferramentas, por isso costumo fazer isso usando a interface do usuário:


1. Primeiro, selecione "confirmar"

Confirmar

2. Em seguida, exiba arquivos ignorados. Se você tiver alterações não confirmadas, oculte-as.

Mostrar arquivos ignorados

3. Agora, selecione todos eles e clique em "Excluir não versionado".

Exclua-os

Feito. É um procedimento muito mais fácil de lembrar do que as coisas da linha de comando.

bytecode77
fonte
Não tenho certeza (eu mesmo uso o SourceTree), mas essas capturas de tela parecem ser do TortoiseHg Workbench. Em geral, acho que as soluções baseadas na interface do usuário são úteis, mas essa resposta precisa de uma melhor identificação. Além disso, "escondê-los" parece um pouco vago para mim.
Jon Coombs
3

O status hg mostrará todos os novos arquivos e você poderá removê- los.

Normalmente eu quero me livrar de arquivos ignorados e não versionados, então:

hg status -iu                          # to show 
hg status -iun0 | xargs -r0 rm         # to destroy

E depois siga com:

hg update -C -r xxxxx

que coloca todos os arquivos com versão no estado correto para a revisão xxxx


Para seguir a tradição do Stack Overflow de dizer que você não deseja fazer isso, muitas vezes acho que essa "Opção Nuclear" destruiu coisas de que me importo.

A maneira certa de fazer isso é ter uma opção 'make clean' em seu processo de compilação, e talvez uma opção 'make reallyclean' e 'make distclean' também.

John Lawrence Aspden
fonte