Mercurial preso “esperando bloqueio”
-
08-06-2019 - |
Pergunta
Ocorreu uma tela azul no Windows ao clonar um repositório mercurial.
Após a reinicialização, recebo esta mensagem para quase todos os comandos hg:
c:\src\>hg commit waiting for lock on repository c:\src\McVrsServer held by '\x00\x00\x00\x00\x00\ x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' interrupted!
O Google não ajuda.
Alguma dica?
Solução
Ao "aguardar bloqueio no repositório", exclua o arquivo do repositório: .hg/wlock
(ou pode estar em
).hg/store/lock
Ao excluir o arquivo de bloqueio, você deve certificar-se de que nada mais esteja acessando o repositório.(Se o bloqueio for uma sequência de zeros ou em branco, isso quase certamente é verdade).
Outras dicas
Quando waiting for lock on working directory
, excluir .hg/wlock
.
Eu tive esse problema sem arquivos de bloqueio detectáveis.Encontrei a solução aqui: http://schooner.uwaterloo.ca/twiki/bin/view/MAG/HgLockError
Aqui está uma transcrição do console Tortoise Hg Workbench
% hg debuglocks
lock: user None, process 7168, host HPv32 (114213199s)
wlock: free
[command returned code 1 Sat Jan 07 18:00:18 2017]
% hg debuglocks --force-lock
[command completed successfully Sat Jan 07 18:03:15 2017]
cmdserver: Process crashed
PaniniDev% hg debuglocks
% hg debuglocks
lock: free
wlock: free
[command completed successfully Sat Jan 07 18:03:30 2017]
Depois disso, o pull abortado foi executado com sucesso.
O bloqueio foi definido há mais de 2 anos, por um processo em uma máquina que não está mais na LAN.Que vergonha para os desenvolvedores do hg por a) não documentarem os bloqueios adequadamente;b) não carimbá-los para remoção automática quando ficarem obsoletos.
O colega de trabalho teve exatamente esse problema hoje, depois de um BSoD ao tentar empurrar.Ele teve que:
- exclua o arquivo
.hg/store/lock
(conforme a resposta aceita) - exclua o arquivo
.hg/store/phaseroots
(conforme este relatório de bug do TortoiseHG)
Então seu repo funcionou novamente.
EDITAR: De acordo com o comentário de @Marmoute - ao lidar com problemas relacionados a bloqueios, usando hg debuglock
é uma alternativa mais segura para excluir cegamente o .hg/store/lock
arquivo.
Estou muito familiarizado com o código de bloqueio do Mercurial (a partir de 1.9.1).O conselho acima é bom, mas eu acrescentaria que:
- Já vi isso na natureza, mas raramente e apenas em máquinas Windows.
- Excluir arquivos de bloqueio é a solução mais fácil, MAS você precisa ter certeza de que nada mais está acessando o repositório.(Se o bloqueio for uma sequência de zeros, isso quase certamente é verdade).
(Para os curiosos:Ainda não consegui identificar a causa desse problema, mas suspeito que seja uma versão mais antiga do Mercurial acessando o repositório ou um problema na chamada socket.gethostname() do Python em determinadas versões do Windows.)
Eu tive o mesmo problema no Win 7.A solução foi remover os seguintes arquivos:
- .hg/store/phaseroots
- .hg/wlock
Quanto a .hg/store/lock - esse arquivo não existia.
Não espero que esta seja uma resposta vencedora, mas é uma situação bastante incomum.Mencionando caso alguém que não seja eu se depare com isso.
Hoje recebi a mensagem "aguardando bloqueio no repositório" em um comando hg push.
Quando eu matei o comando hg pendurado, não consegui ver nenhum .hg/store/lock
Quando procurei .hg/store/lock enquanto o comando estava travado, ele existia.Mas o arquivo de bloqueio foi excluído quando o comando hg foi eliminado.
Quando fui até o alvo do push e executei hg pull, sem problemas.
Eventualmente, percebi que o ID do processo no hg push era uma mensagem de espera de bloqueio que mudava a cada vez.Acontece que o "hg push" estava pendurado esperando por um bloqueio mantido por si mesmo (ou possivelmente um subprocesso, não investiguei mais).
Acontece que os dois espaços de trabalho, vamos chamá-los de A e B, tinham árvores .hg compartilhadas por link simbólico:
A/.hg --symlinked-to--> B/.hg
Isso NÃO é uma boa coisa a se fazer com o Mercurial.O Mercurial não entende o conceito de dois espaços de trabalho compartilhando o mesmo repositório.Eu entendo, no entanto, como alguém vindo de outro VCS para o Mercurial pode querer isso (o Perforce deseja, embora não seja um DVCS;o Bazaar DVCS supostamente pode fazer isso).Estou surpreso que um REP-ROOT/.hg com link simbólico funcione, embora pareça funcionar, exceto por esse push.
Se o repositório bloqueado fosse o original, não consigo imaginar que fosse modificando cloná-lo, então só impedia que você mudasse no meio e estragasse o clone.Deve ficar bem depois de remover a trava.
A nova cópia clonada (se fosse um clone local) poderia estar em qualquer tipo de estado malformado, então você deve jogá-la fora e reiniciá-la.(Se fosse um clone remoto, espero que tenha falhado e já tenha descartado a cópia incompleta.)
Encontrei esse problema no Mac OS X 10.7.5 e Mercurial 2.6.2 ao tentar fazer push.Após atualizar para o Mercurial 3.2.1, recebi "nenhuma alteração encontrada" em vez de "aguardando bloqueio no repositório".Descobri que de alguma forma o caminho padrão foi definido para apontar para o mesmo repositório, então não é de surpreender que o Mercurial fique confuso.
Se isso acontecer apenas em unidades mapeadas, pode ser um bug https://bitbucket.org/tortoisehg/thg/issue/889/cant-commit-file-over-network-share.Usar o caminho UNC em vez da letra da unidade parece evitar o problema.
Eu tive o mesmo problema.Recebi a seguinte mensagem quando tentei confirmar:aguardando bloqueio no diretório de trabalho mantido por ''
hg debuglock mostrou isso:trancar:Wlock grátis:(66722s)
Então executei o seguinte comando e isso resolveu o problema para mim:hg debuglocks -W
Usando Win7 e TortoizeHg 4.8.7.